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代码

双倍温度 = 1.0e - 5 * -44954;
双 bstar = tempnum / pow(10.0, 3);

printf bstar 给我 -0.000450

感谢您到目前为止的回复,但是 PHP 是如何得出这个结论的......

$twopi = 6.28318530717958623; /* 2*Pi */
$xmnpda=1440;//1.44E3 ; /* 每天分钟 */

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

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

echo $xndt2o 在 PHP 中给了我 -1.8256568188E-9 但在 C 中它给了我 -0.000000

我不知道 PHP 中的所有内容。

4

3 回答 3

3

有限精度的浮点格式几乎总是有点不准确,这些不准确会相互叠加并以意想不到的方式表现出来。通常,结果并没有那么大的错误,但唯一的问题是您没想到会出现错误。有关一般说明,请阅读浮点指南

也许与您的问题最相关:永远不应期望计算序列在平台之间产生完全相同的结果,因为有许多因素可能导致执行不同的实际原始操作。这篇论文非常详细地解释了它。.

对于您所看到的差异,一个更简单的解释可能是 PHP 代码以某种方式仅在某处使用 32 位浮点数,因为差异显示在小数点后 6/7 位左右,就在 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 浮点数实际上是双精度数,即双精度 64 位数字。它们有 52 位尾数,可以精确存储高达 2^53-1 的整数值。因此,如果您最多使用 53 位,则可以使用浮点数。

但是,您应该注意一个转换警告。

浮点到字符串的转换不能跨系统和 PHP 版本移植。因此,如果您正在处理存储为浮点数的大量数字(尤其是在 32 位系统上,其中 32 位 int 溢出将隐式​​转换为浮点数)并得到奇怪的结果,请记住字符串转换可能会让您失望。另一方面,sprintf() 在修复 PHP 在数值处理中的“微妙之处”时始终是一个朋友:它可用于解决有符号和无符号 int 问题;它有助于浮点格式;永远是救世主。

参考资料 - MySQL 性能博客

于 2011-01-24T02:37:59.860 回答