Как можно проверить отрицательный ноль в PHP? - PullRequest
0 голосов
/ 12 октября 2019

В PHP есть отрицательный ноль с плавающей точкой, который идентично сравнивается с положительным нулем с плавающей точкой -0.0 === 0.0, несмотря на то, что он печатает как разные строки. В PHP нет целого отрицательного нуля.

Я пишу расширенную версию функций округления и пытаюсь максимально воспроизвести собственное поведение PHP. Я пишу это по методологии TDD, поэтому мне нужен способ убедиться, что мой код соответствует собственным функциям PHP, возвращая отрицательный ноль, где PHP возвращает отрицательный ноль.

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

Есть ли способ проверить -0.0 кроме:

  • , преобразующего его в строку (string)-0.0 === '-0'
  • , сериализовавшего его serialize(-0.0) === 'd:-0;'

Ответы [ 2 ]

3 голосов
/ 12 октября 2019

@ 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
1 голос
/ 12 октября 2019

Эта работа только для литералов , но не для переменных:

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 и 0.0 ** -1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...