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

Mik*_*iko 5 php floating-point precision

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

示例:

#include <stdio.h>

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

PHP示例:

<?php

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

?>
Run Code Online (Sandbox Code Playgroud)

C 示例将导致122868.343750122868.349440而 PHP 将以122868.349440.

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

Rap*_*tor -2

浮点数的精度有限。虽然这取决于系统,但 PHP 通常使用 IEEE 754 双精度格式,由于按 1.11e-16 的顺序舍入,这将给出最大相对误差。非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。

此外,可以精确表示为以 10 为基数的浮点数的有理数(例如 0.1 或 0.7),没有精确表示为以 2 为基数的浮点数(无论尾数的大小如何,在内部使用)。因此,它们无法在不损失少量精度的情况下转换为内部二进制对应项。这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示类似于 7.9999999999999991118...

因此,永远不要相信浮点数结果到最后一位,也永远不要比较浮点数是否相等。如果需要更高的精度,可以使用任意精度数学函数和 gmp 函数。

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

要更改 PHP 的精度级别,请更改php.iniprecision中的设置