Iは、Iが必要と直交法の正確さの程度を証明するためにジュリアを使用するので、それは1.6000000000000012
Juliaの浮動小数点演算の回避策はありますか?
であることが、このような1.6
としても単純な値を出力することを特徴とジュリアの浮動小数点丸め演算の可能な回避策はあり最終的には積分の計算値が正確な値と等しいことを示していますが、場合によっては後続の小数点の矛盾があるため、これを行うことができません。
Iは、Iが必要と直交法の正確さの程度を証明するためにジュリアを使用するので、それは1.6000000000000012
Juliaの浮動小数点演算の回避策はありますか?
であることが、このような1.6
としても単純な値を出力することを特徴とジュリアの浮動小数点丸め演算の可能な回避策はあり最終的には積分の計算値が正確な値と等しいことを示していますが、場合によっては後続の小数点の矛盾があるため、これを行うことができません。
はジュリアでは、あなたが精度を失うことなく、有理数を表すためにRational
タイプを使用することができます。ドキュメントhereを参照してください。 しかし、Rational
からReal
に昇格させないように計算に非常に注意する必要があります。次のように1.6
の
あなたの例では表すことができる:
> x = 16//10
8//5
ジュリアは、分母と分子を覚えているだろうとのような値を格納します。これらの有理数を使って派生値を真の値と比較することができます。
最終的に浮動小数点数に変換する必要がある場合(例えば、結果が不合理であるため)、より高い精度を得るためにBigFloat
型を使用することができます。Rational
番号BigFloats
を用いた場合であっても、あなたの精度の改善を与えるだろう:
> @printf "%.100f" BigFloat(1.6 - 1.5)
0.1000000000000000888178419700125232338905334472656250000000000000000000000000000000000000000000000000
> @printf "%.100f" BigFloat(16//10 - 15//10)
0.1000000000000000000000000000000000000000000000000000000000000000000000000000002159042138773611156347
これは、浮動小数点数が固定された有限数のビット(通常は32または64)として格納されるため、無限の精度で任意の数量を表すことができません。特に、ベース2表現を使用するため、ベース10で正確に表現できる量(1.6など)は、ベース2で正確に表現できない場合があります。あなたは、この有限精度をあなたの証明で考慮に入れる必要があります。
私は特にjuliaの経験はありませんが、通常はプログラミング言語として2つ以上の数値タイプがあります。おそらく、あなたが使用できる任意の精度の浮動小数点ライブラリが存在します。
投稿する回答:Exact decimal arithmetic in Juliaを参照してください。BigFloatまたはRationalのいずれかを使用する可能性があります。浮動小数点数の精度が「少なくともN小数点以下」になるようにするには、前者を使用します。ここで、Nはあなた次第です。もしあなたがやっていることが恣意的かつ境界がある小さなエラーでも壊れている場合は、後者を使用してください。
は小数点リテラルは、浮動小数点へ 数値に変換されるため、解析された。なお、ビッグフロート(2.1)何が得られないことがあります。あなたが
BigFloat
を使用している場合、あなたはおそらく手動でリテラル値を初期化したいと思いますあなたは期待しています。 では、parse()、 、または大きな文字列リテラルを使用して、文字列から定数を初期化することができます。
ジュリア>ビッグフロート(2.1)大きな 2.100000000000000088817841970012523233890533447265625000000000000000000000000000
ジュリア> "2.1" 2.099999999999999999999999999999999999999999999999999999999999999999999999999986
がhttp://stackoverflow.com/questions/588004/is-floating-point-math-broken?rq=1 – Asik
を参照してくださいあなたは[ビッグフロートを考慮しました](http://docs.julialang.org/en/release-0.4/stdlib/numbers/#Base.BigFloat)? – Philip
@Philip:いいえ、私はそうではありませんが、BigFloatでも同様の不一致が起こりません。唯一の違いは誤った小数点の位置ですか? – stark