浮動小数点演算の奇妙さJMP15を使用しています。
最近、私がしばらく使用してきたスクリプトに、以下に示す浮動小数点の癖による小さなエラーがあることに気付きました。
最初の2行は同じ数を計算します-> 23。
天井関数を使用すると、最初のバージョンは24を返し、2番目のバージョンは23を返します。
これは起こっているのでしょうか?
show((((1104/2016)* 42));
show((((42 * 1104/2016))));
show(ceiling((1104/2016)* 42));
show(ceiling((42 * 1104/2016))));
/ *:
(1104/2016)* 42 = 23;
42 * 1104/2016 = 23;
天井((1104/2016)* 42)= 24;
天井(42 * 1104/2016)= 23;
スクリプティング再:浮動小数点数学の奇妙さこれは浮動小数点の癖であることがすでにわかりました。技術的には発生していませんが、浮動小数点計算が原因で常に「丸めの問題」が発生します。
最初の計算を列(1104/2016)* 42に入れる場合、列の幅を30(任意に大きい)に変更し、フォーマットを小数点以下20桁の固定小数点にフォーマットすると、数値は23.00000000000000355271として保存されていることがわかります。。
再:浮動小数点数学の奇妙さ2016:2×2×2×2×2×2×3×3×7
1104:2×2×2×2×3×23
42:2×3×7
1104/2016は( 2×2×2×2×3× 23)/( 2×2×2×2× 2× 3× 3×7)
23 /(2×3×7)は、基数10と基数2(16進数で4ビットで示される16進数、基数16)の繰り返し部分です。
0.5476190476190476190476190 ... または3FE186186186186 ... (視覚化のための幸運な12ビットの繰り返し!)
これらはどちらも省略されており、不正確です。hex base 2表現の実際の値は3FE1861861861862に丸められ、わずかに高くなります(3FEは指数です)。除算後の42を掛けても、少し高いです。
(42×1104)/ 2016は(( 2×3×7 )×( 2×2×2×2×3× 23))/( 2×2×2×2×2×3×3×7 )
除算の前に42を掛けると、素数の除数がかなり小さくなります。
再:浮動小数点数学の奇妙さ私はその答えを組み立てるつもりだと思います