3

なぜこれが起こるのか、そしてそれを修正できるかどうかは誰にも分かりません。C と PHP の結果を比較していますが、PHP の結果は異なります。

必要に応じてコードを提供できますが、以前にこれを経験した人はいますか?

PHP コード

$tempnum = 1.0e - 5 * -44954; // substr($line1,53,6);
$bstar = $tempnum / pow(10.0, 3);

$bstar は PHP で -0.00044954 を返しますが、-0.000450 のはずです

Cコード

double tempnum = 1.0e - 5 * -44954;
double bstar = tempnum / pow(10.0, 3);

printf bstar は私に -0.000450 を与えます

これまでの回答に感謝しますが、PHP はどのようにしてこの結論に達したのでしょうか...

$twopi = 6.28318530717958623; /* 2*パイ */
$xmnpda= 1440; //1.44E3; /* 1 日あたりの分数 */

$temp = (($twopi/$xmnpda)/$xmnpda);

$xndt2o = -0.000603;
$xndt2o = $xndt2o * $temp;

echo $xndt2o は PHP では -1.8256568188E-9 を返しますが、C では -0.000000 を返します

PHPでそれが何であるかはわかりません。

4

3 に答える 3

3

限られた精度の浮動小数点形式は、ほとんどの場合、わずかに不正確であり、これらの不正確さが互いに組み合わさり、予期しない形で現れる可能性があります。通常、結果はそれほど間違っていませんが、唯一の問題は、不正確さを予期していなかったことです。一般的な説明については、The Floating-Point Guide を参照してください。

おそらくあなたの質問に最も関連するのは、異なる実際のプリミティブ操作が実行される原因となる可能性のある多くの要因があるため、一連の計算がプラットフォーム間でまったく同じ結果をもたらすことは決して期待されるべきではないということです。この論文はそれを非常に詳細に説明しています。.

あなたが見ている違いのもっと簡単な説明は、PHPコードがどういうわけかどこかで32ビット浮動小数しか使用していないということかもしれません.

于 2011-01-23T23:45:44.403 に答える
2

printfより多くの桁を表示するように指示した場合、同等の C コードは同じ結果を返します。

printf("%.8f\n", bstar);
于 2011-01-23T23:45:52.370 に答える
0

助けてくれてどうもありがとう。私はそれを理解しました。

PHP で大きな数を処理する必要がある場合があります。たとえば、32 ビットの識別子では不十分な場合があり、BIGINT 64 ビットを使用する必要があります。

64ビット整数がPHPにあるという混乱については、すでに書いていました。ただし、使用する数値が 64 ビットの範囲を完全にカバーしていない場合は、浮動小数点数を使用すると問題が解決する可能性があります。秘訣は、PHP の float が実際には double、つまり倍精度の 64 ビット数であることです。仮数は 52 ビットで、2^53-1 までの整数値を正確に格納できます。したがって、最大 53 ビットを使用している場合は、浮動小数点数で問題ありません。

ただし、変換に関する注意事項があります。

浮動小数点から文字列への変換は、システムや PHP のバージョン間で移植できません。そのため、float として格納された大きな数値を処理している場合 (特に、32 ビットの int オーバーフローが暗黙的に float に変換される 32 ビット システムでは)、奇妙な結果が得られる場合は、文字列の変換に失望する可能性があることに注意してください。一方、sprintf() は、数値処理における PHP の「微妙な点」を修正することに関しては常に友人です。フロートの書式設定に役立ちます。いつも救世主。

リファレンス - MySQL パフォーマンス ブログ

于 2011-01-24T02:37:59.860 に答える