为什么 PHP 的浮点数 0(零)显示带有符号


Why PHP's float 0 (zero) is being displayed with sign?

在PHP中,让我们创建一个变量并将其值设置为0

$x = 0;
echo $x;

它将显示0.如果将其乘以-1

$x = -1 * $x;
echo $x;

我们仍然看到0.但如果$x是浮点数:

$x = 0;
$x = (float)$x;
$x = -1 * $x;
echo $x;

我们会得到输出:-0 .

为什么?无论其基础类型如何,零不应该始终显示为无符号吗?

因为PHP通常使用IEEE 754双精度格式的浮点数,其中包括:

1) 符号(1 位)

2) 指数(11 位)

3) 分数(52 位)

如果将$x乘以 -1,则设置符号位。

整数使用两个补码,其中最高有效位 (MSB) 确定符号。如果乘以 0,则 MSB 为 0。

请参阅:https://en.wikipedia.org/wiki/Signed_zero

浮点零不仅仅用于绝对零。它用于表示微小的结果,即使对于低于正数,绝对幅度也太小。

在某些计算中,这些数字的符号确实很重要。例如,重要的是 1/+0 是正无穷大,但 1/-0 是负无穷大。为了使这项工作正确,将 0 乘以 -1 得到 -0。

例如,参见W. Kahan的论文"复杂基本函数的分支切割或关于无的符号位的很多ado"。