如何在PHP中模拟单精度浮点运算?

时间:2011-11-15 02:12:55

标签: php floating-point precision

我需要将一个简单的C程序移植到PHP。目前我们必须启动该过程并解析它的输出。该程序非常简单,但算法使用float非常重要,因为错误总结并且结果将会消失。

C示例:

#include <stdio.h>

int main( void ) {
  printf("%f\n", 123456 * (float)0.99524);
  printf("%f\n", 123456 * (double)0.99524);

  return 0;
}

PHP示例:

<?php

printf("%f\n", 123456 * 0.99524);

?>

C示例将导致122868.343750122868.349440,而PHP将以122868.349440结束。

如何在PHP中获得C float结果?

3 个答案:

答案 0 :(得分:2)

使用内置的php函数无法做到这一点。

使用“double”的那个给你真实的结果,100%精确。浮动一个是错误的。

在PHP中,float和double是相同的类型,它是double。

如果您需要高精度结果,总是会得到相同的结果,请尝试使用BC Math模块:http://php.net/bcmath

使用BC Math的示例代码:

$result = bcmul("123456", "0.99524", 6); // gives 122868.34944
$result = number_format($result, 6, ".", ""); // 122868.349440 - appending zeros
echo $result;

输出:

122868.349440

如果你真的想要与C程序中的结果相同,那么你有两个选择:

  1. 通过编写php扩展来创建自己的类c函数:http://www.google.com/search?q=writing+php+extensions

  2. 通过函数proc_open()从PHP与您的C程序对话: http://www.php.net/manual/en/function.proc-open.php(另请参阅popen(),exec()或shell_exec())

答案 1 :(得分:0)

您总是可以创建一个PHP模块。

以下列出了我随时间编制的资源......

http://www.delicious.com/homer6/php+extension

另外,我强烈推荐阅读Sara Goleman的书:

http://blog.simonholywell.com/post/1156691738/15-excellent-resources-for-php-extension-development

希望有帮助...

答案 2 :(得分:-2)

  

浮点数的精度有限。虽然这取决于   在系统中,PHP通常使用IEEE 754双精度格式,   由于订单的舍入,这将产生最大的相对误差   1.11e-16。非基本算术运算可能会更大   错误,当然,必须考虑错误编程   几个操作复杂化。

     

此外,有理数的数字可以完全表示为   基数10中的浮点数,如0.1或0.7,没有   精确表示为基数2中的浮点数,即   内部使用,无论尾数的大小。因此,他们   没有a就无法转换成它们的内部二进制对应物   精度损失小。这可能导致令人困惑的结果:for   例如,floor((0.1 + 0.7)* 10)通常会返回7而不是   预期8,因为内部表示将是类似的   7.9999999999999991118 ....

     

所以永远不要将浮动数字结果信任到最后一位数字,永远不要   比较浮点数是否相等。如果精度更高   必要的,任意精度数学函数和gmp函数   可用。

引自:http://php.net/manual/en/language.types.float.php

要更改PHP的精确级别,请更改 php.ini

中的precision设置