php浮動小数点数の正確な演算について簡単に話します

1197 ワード

bcはBinary Calculatorの略です.bc*関数のパラメータは、string bcadd(string$left_operand,string$right_operand[,int$scale])のようなオペランドにオプションの[int scale]を加えたオペランドです.scaleが提供されていない場合は、bcscaleのデフォルト値を使用します.ここで大数は直接0−9からなるstringで表され,計算結果もstringを返す.
bcadd――2つの高精度数字をbccompに加算――2つの高精度数字を比較し、-1,0,1 bcdiv――2つの高精度数字をbcmodに相殺する――高精度数字の残数bcmulを求める――2つの高精度数字をbcpowに乗算する――高精度デジタル乗方bcpowmodを求める――高精度デジタル乗方を求める数論ではbcscaleがよく使われています.デフォルトの小数点数を配置するのは、Linux bcの「scale=」bcsqrtに相当します.高精度のデジタル平方根bcsubを求めます.2つの高精度のデジタルを減算します.
まずコードを見てみましょう.

 
 

印刷された値はboolean falseです
どうして?PHPマニュアルは浮動小数点数に対して以下の警告メッセージがあります.
Warning浮動小数点数精度は明らかに単純な10進数数が0.1または0.7のようにわずかな精度を失わずに内部バイナリのフォーマットに変換できない.これは混乱した結果をもたらします.たとえば、floor((0.1+0.7)*10)は通常、予想された8ではなく7を返します.この結果の内部の表示は実際には7.9999999999に似ているからです.これは一つの事実と関係があり、それは有限桁数でいくつかの10進数を正確に表現することは不可能である.例えば、10進数の1/3は0.333333.となる.だから、浮動小数点数の結果が最後の1位に正確になったとは信じないでください.2つの浮動小数点数が等しいかどうかも比較しないでください.確かにより高い精度が必要な場合は、任意の精度数学関数またはgmp関数を使用する必要があります.
では、上の計算式は

 
 

これで浮動小数点数の計算問題を解決できます