如何在 PHP 中测试负零?

How can negative zero be tested for in PHP?

在 PHP 中有一个浮点负零,它与浮点正零 -0.0 === 0.0 比较相同,尽管打印为不同的字符串。 PHP.

中没有整数负零

我正在编写舍入函数的扩展版本,并试图尽可能地复制 PHP 的本机行为。我正在使用 TDD 方法编写它,因此我需要一种方法来验证我的代码是否符合本机 PHP 函数,方法是返回负零,其中 PHP returns 负零。

<?php
var_dump(ceil(-0.5));
double(-0)

除了

,还有什么方法可以测试 -0.0

这项工作仅适用于文字但不适用于变量:

var_export(0.0 ** 0 == 1);
var_export(-0.0 ** 0 == -1);

但这似乎也适用于变量:

// return 1 for positive zero, -1 for negative zero
// otherwise return 0
function zero_sign(float $x): int {

    if (($y = ($x ** -1)) === -INF)
        return -1;

    return $y === INF;
}

var_export(zero_sign(-0.0) === -1);
var_export(zero_sign(0.0)  ===  1);
var_export(zero_sign(-1.0) ===  0);
var_export(zero_sign(1.0)  ===  0);

你可以自己检查这是否符合数学规则, 这是 Wolframalpha 结果 -0.0 ** -1 and 0.0 ** -1

@njuffa 建议 if (1 / $x === -INF),它有效但会抛出被零除的警告。

@Manu-sh 通过使用新的 "power of" 运算符将其修改为在没有警告的情况下执行相同的操作:**

<?php
function is_negative_zero($x) {
  return $x ** -1 === -INF;
}

echo is_negative_zero(0.0)? "Yes": "No";
echo PHP_EOL;

echo is_negative_zero(-0.0)? "Yes": "No";
echo PHP_EOL;

输出:

No
Yes

浮点数有一个特定的位,如果它是负数则在内部编码中设置。该测试也适用于区分 +0.0 和 -0.0。该测试也独立于 PHP 如何使用 -0.0 和 +0.0 执行操作。

function isNegativFloat($value){
  return is_float($value) AND ord(pack('E',$value)) & 0x80;
}

示例:

var_dump(isNegativFloat(0.0));  //bool(false)
var_dump(isNegativFloat(-0.0));  //bool(true)
var_dump(isNegativFloat(0.6));  //bool(false)
var_dump(isNegativFloat(-0.6));  //bool(true)

负浮点零的特殊测试:

function isNegativFloatNull($value){
  return $value === 0.0 AND isNegativFloat($value);
}

示例:

var_dump(isNegativFloatNull(0.0));  //bool(false)
var_dump(isNegativFloatNull(-0.0));  //bool(true)
var_dump(isNegativFloatNull(0.6));  //bool(false)
var_dump(isNegativFloatNull(-0.6));  //bool(false)