2017-04-01 19 views
0

私はいくつかの特定の規則に従って入力を丸める関数Fをプログラムしました。たとえば、入力がF(0.1355)の場合、出力は1.4b-1となります。問題は、私がF(0.1355)^2をするときに、それは私に0.14^2、すなわち1.96b-2を与えなければならないとき、私に1.96382999420166b-2を与えます。なぜこうなった?どうすれば修正できますか?最大値の関数の出力

これは私の関数のコードです:

F(x):=(block ([log10,aaa,fpprec],log10(x):=entier(log(x)/log(10)), 
    vnorm(x):= if x/(10^(log10(x)))<2 then 1/(10^(log10(x)-1)) else 1/10^(log10(x)), 
    aaa(x):= x*vnorm(x), 
    fpprec:if aaa(x)<20 then 2 else 1,bfloat((round(aaa(x)))*1/vnorm(x)))); ` 

さらに詳しい情報:私はがグローバル変数としてFPPREC宣言することはできません。私はそれが私の問題を解決することを知っています。 よろしくお願いいたします。

リエケット。

答えて

1

さて、問題はF(x)^2が前記第1 F(x)fpprec = 2で計算されblockfpprec外の値で計算されることです。その結果をfooと呼んでください。 foo^2fpprec = 16で計算されます。

bigfloat計算の精度をオペランドの精度に制限する方法はわかりません。単純化規則(tellsimpまたはtellsimpafter)で可能かもしれませんが、もしそうなら、おそらく簡単ではありません。

ここでいくつかの進歩を遂げるための2つのアイデア。 (1)ビッグフロートの代わりに有理数を使うことを検討する。私。 1.4b-1の代わりに7/5を返します。 (2)印刷する桁を制限しようとしているだけの場合は、fpprintprecを使用します。

多分もっと大きな目標があるとすれば、誰かがアドバイスを受けるでしょう。

+0

ええ、簡単な解決策はありません。私は出力有理数を持つことを望んでいないので、私はそのように考えなかった。とにかく、あなたが指摘したように、私はfpprintprecを使いますが、表示を制限します。ありがとうございました! – Topologicalife

関連する問題