За последние 24 часа нас посетили 91742 программиста и 6165 роботов. Сейчас ищут 1340 программистов ...

Минус ноль

Тема в разделе "Прочие вопросы по PHP", создана пользователем artoodetoo, 13 янв 2023.

Метки:
  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    В порядке прикола или тест на внимательность

    Код (Text):
    1.  
    2. $ php -a
    3. Interactive mode enabled
    4.  
    5. php > $x = 0.0;
    6. php > $y = -$x;
    7. php > var_export($x);
    8. 0.0
    9. php > var_export($y);
    10. -0.0
    11. php > var_export($x === $y);
    12. true
    :) как так?!

    https://reqbin.com/gws2gito
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    Очевидно что несмотря на [ строгое ] равенство +0.0 и -0.0 есть кейсы, когда разница есть. И это внезапно™ может выйти боком в вашем скрипте.

    Есть разница во внутреннем (бинарном) представлении +0.0 и -0.0:
    Код (Text):
    1.  
    2.  
    3. php > echo bin2hex(pack("f", 0.0));
    4. 00000000
    5. php > echo bin2hex(pack("f", +0.0));
    6. 00000000
    7. php > echo bin2hex(pack("f", -0.0));
    8. 00000080
    9.  
    10. php > var_dump(unpack("f", "\x00\x00\x00\x00")[1]);
    11. float(0)
    12. php > var_dump(unpack("f", "\x00\x00\x00\x80")[1]);
    13. float(-0)
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    На всякий случай: это не фишка PHP, это фишка стандарта представления вещественных чисел IEEE 754
    Python, JS, Java: вещественные 0 и -0 везде "равны", но текстовое представление -0.0 сохраняет знак "-".