За последние 24 часа нас посетили 19067 программистов и 1820 роботов. Сейчас ищут 1025 программистов ...

Чудеса интерпретации

Тема в разделе "Прочее", создана пользователем Dagdamor, 28 ноя 2008.

  1. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    PHP:
    1. <?php
    2.  
    3. echo (float)"-";
    Ждал нолик, а вылезло почему-то "-0"... :? Что это за число такое? (PHP 5.2.5)
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Число стремиться к минус нулю :D
     
  3. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    PHP:
    1. <?php
    2. if(-0 === 0)
    3. {
    4.     echo'Минус ноль равно нулю';
    5. }
    Прикольно, а плюс ноль тоже ноль? :)
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    PHP:
    1.  
    2. <?php
    3.  if(0-0 === 0)
    4.   {
    5.       echo'Минус ноль равно нулю';
    6.   }
    Походу, если перед минусом отсутствует цифра, то интерпретатор подставляет 0.
     
  5. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    а может он так nil представляет...
     
  6. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Покопал литературу. Оказывается, плавающие числа в современных машинах/процессорах представляются так, что действительно, бывает ноль без знака, а бывает ноль со знаком :/ причем в математических операциях между ними нет разницы, а вот при сравнении они вроде как разные числа. Зачем так было сделано - ХЗ, зачем PHP трактует минус как минус ноль - тоже ХЗ, в скрипт добавлена заплатка, писать на bugs.php.net лень.

    antonn
    Если ты про null, то null это null, а float это float. Разные типы данных. Я жестко привожу тип к float.
     
  7. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Число стремится к нулю слева. :)
     
  8. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Dagdamor
    Т.е. у тебя нет сомнений, что вот в этой фигне (float)"-"; нет nul? Ты точно знаешь механизмы интерпритации и все такое?...
     
  9. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    antonn,
    Код (Text):
    1.     sign = nz0 = nz = 0;
    2.     value(rv) = 0.;
    3.  
    4.     ...
    5.  
    6.     if (*s == '-') {
    7.         sign = 1;
    8.         s++;
    9.     } else if (*s == '+') {
    10.         s++;
    11.     }
    12.  
    13.     if (*s == '\0') {
    14.         s = s00;
    15.         goto ret;
    16.     }
    17.  
    18.     ...
    19.  
    20.     if (se)
    21.         *se = (char *)s;
    22.     result = sign ? -value(rv) : value(rv);
     
  10. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Sergey89
    речь идет именно о сабжевой конструкции, и о том, как интерпритатор представит его и к какому типу приведет.
     
  11. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    antonn
    Не nul, а null!
    Да, точно уверен. Конструкция (float)$value должна приводить выражение к типу float.
    null - другой тип.
    Да и так видно, что результат имеет тип float, отображается-то нолик?
     
  12. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    ну null так null, в разных языках по разному, уже путаюсь (да и не суть важно, меня поняли).

    отображается где? :) то, что отображается - уже даже не нолик, это 48 в байтике :)

    я еще раз попробую сказать - ты уверен, что интерпритатор делает в точности то, что ты говоришь? что он не понимает твою конструкцию как ему виднее? тем более что в пхп типизация очень даже пространная.
     
  13. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    antonn
    Отображается в первом сообщении темы.
    Я не говорю "того, что интерпритатор делает". Я говорю, что пытаюсь привести строку к числу. PHP это позволяет. Вот только число в результате получается какое-то... странное. Вот и все. При чем тут NULL - в упор не понимаю.
     
  14. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    null это отсутствие киких либо данных, тут оно явно не к месту
     
  15. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    блин, не писали вы интерпритаторы... ладно, не буду настаивать, нет там null, есть нолик и вобще там волшебство.
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. <?php
    2. $a=(float)"-";
    3. echo gettype($a);
    4. ?>
    Оба ошиблись ;-)

    Upd. Наверное, разделение в PHP float и double чисто символическое. Кажется, что есть только 2 типа - integer и string. Если (float) заменить на (int), получим 0, как при обраотке через (int) любой другой строки. А (float) его (минус) съедает нормально. Отсюда такие рассуждения, это конечно только мои догадки.
     
  17. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Преобразование к float выполнено по тому коду, что я привёл. И оттуда ясно видно, откуда минус берётся.

    А float и double в php одно и то же.
     
  18. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Дело в том, что

    phpclub.ru
     
  19. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Тогда уж из антиматерии, стебаться - так стебаться с умом ;)
    А у строк из темной материи длина выражается комплексным числом.
     
  20. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ну нет у float-типа такого значения как 0. Нет. В принципе. Только если под него специальный бит не отвели (на каких-то архитектурах это было). Есть очень близкое к нулю положительное и очень близкое к нулю отрицательное. Потому как в какую степень число не возводи все-равно будет больше нуля (ну или меньше).
     
  21. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Вот даже как...
     
  22. sword dancer

    sword dancer Активный пользователь

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    а какое число обозначает мантисса из одних нулей?
     
  23. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Ну вот, пришел Гусев и все разрулил :) Как всегда :)
     
  24. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    AlexGousev
    А вот и нет. Строго говоря, число, представленное одними нулями в двоичной записи, означает что-то типа 1e-128, т.е. очень маленькое число, но во всех операциях такая запись трактуется как особая. В вещественной арифметике 8x86 есть специальные записи для: 0 (как выяснилось, отдельно для +0 и -0), для NaN, и для двух бесконечностей. Может, еще что-то есть, но я читал только об этих.

    Ради эксперимента можешь сложить два нуля. У тебя получится такой же ноль, а не "очень маленькое, но в два раза большее" число :)
     
  25. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Абидна, да! :)

    Dagdamor
    Я о способе хранения, а не о способе обработки. То, что такой вариант специально обрабатывается - это уже логика процессора. Просто суть-то в том, что способ хранения - число в степени. Отсюда и неточность и отсутствие строгого нуля.