За последние 24 часа нас посетили 19599 программистов и 1603 робота. Сейчас ищет 881 программист ...

Что это? :shock:

Тема в разделе "Прочие вопросы по PHP", создана пользователем freeneutron, 7 сен 2009.

  1. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Попробуйте запустить в php5 такой код:
    Код (Text):
    1. echo serialize(.1000000000000123456789);
    Результат противоречит всем логичным ожиданиям.
     
  2. Hight

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

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    freeneutron
    аватарку на фото смените или удалите
     
  3. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Так и думал, что толкового ответа на этом форуме ни кто не даст.
     
  4. kostyl

    kostyl Guest

    freeneutron
    что бы тебе ответили если бы ты вошел в аэропорт голышем?
    Правила для начала соблюдай...
     
  5. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Можно подумать, что тут все такие фантазеры, что увидав аватарку, застеснялись мне отвечать. Да тут кроме красивого домена и некчемных правил ни чего нету.
     
  6. kostyl

    kostyl Guest

    можно подумать что ты тут супер феномен извложил.
    (зы: если больше ничего тут нету кроме домена и правил, то хрена ты тут забыл тогда? развелось блин умников ждущих толковых ответов на бестолковые вопросы)
     
  7. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Думал время лечит убогие форумы. Однако, надежды не оправдались.
     
  8. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а че.весело...

    hosting(440hz):~$>php -r "echo unserialize(serialize(.1000000000000123456789));"
    0.10000000000001

    =)
     
  9. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    да куда уж нам, до великих, уж простите нас, убогих...
     
  10. в пхп.ини - параметр serialize_precision

    Как дети, право слово, как будто floating point впервые увидели.
     
  11. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    У меня получается следующее
    Код (Text):
    1. d:0.10000000000001234290447627017783815972506999969482421875;
    Исходная точность уменьшена и добавлено 40 байт мусора. Здась надо два параметра.
     
  12. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А, что, собственно, ожидается от float?
     
  13. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Еще раз покажу, что происходит в моем примере:
    serialize меняет float
    0.1000000000000123456789
    на string
    0.10000000000001234290447627017783815972506999969482421875
    Видите разницу? Вы ожидали, что serialize отрежит от исходного числа последние 5 цифр, а на их место поставит 40 цифр мусора? Если для вас это вполне закономерно, то объясните мне, в чем тут прикол...
    Вот еще пример:
    Код (Text):
    1. $a=.11;
    2. $b=$a*10;
    3. echo serialize($a)."<br>";
    4. echo serialize($b)."<br>";
    Вот его результат:
    Десятичные числа, при умножении на 10, сдвигаются на 1 регистр влево. Для мусорного хвоста это правило не действует. И что, это тоже логичное поведение float?
     
  14. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Код (Text):
    1.  
    2. hosting(root):/var/log/nginx#>php -r " echo unserialize(serialize('.10000000000123456789'));"
    3. .10000000000123456789
    я вижу полет мысли, но не вижу решения.
    =)
     
  15. документированое.
     
  16. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    440HzВы предлагаете ковычки... Но это не поможет, если нам надо сохранить массив вещественных чисел. Мусорный хвост лепится к каждому числу и неопраданно расходует память.
     
  17. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    вам шашечки или ехать?
     
  18. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    Код (Text):
    1.  
    2. hosting(root):/var/log/nginx#>php -r " ini_set('serialize_precision',10); echo unserialize(serialize(.123456789));"
    3. 0.123456789
     
  19. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    А это хорошее решение. Пусть не универсальное, зато мусор отсекает, верно.
     
  20. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    freeneutron, думаю, я щас вас сильно удивлю :
    PHP:
    1. <?php
    2.     $a = (0.7+0.1)*10;
    3.     $b = 8.0;
    4.     var_dump($a, $b, ($a == $b));
    5. ?>
    Код (Text):
    1. float(8)
    2. float(8)
    3. bool(false)
     
  21. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    TheShock
    PHP:
    1. <?php
    2.      $a = (0.7+0.1)*10;
    3.      echo serialize($a);
    4. ?>
    Я еще с дества помню что в double (float в php это double) всегда допускается погрешность. Это связано с работой процессора, а не с языком программирования.
     
  22. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    [vs] и TheShock Погрешность о которой вы говорите - это неопределенность в последнем регистре. Про это написано в руководстве к любому языку, работающему с вещественными типами ограниченной точности. Но тут дело не в типе, дело в функции serialize(), которая зачем-то прилепляет мусорный хвост к вещественным числам, причем длинна этого хвоста привышает длинну мантисы - значащей части float.
     
  23. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    freeneutron
    Всё просто, настройка serialize_precision, она задаёт точность, с которой вещественные числа сериализуются. Это вполне нормальное поведение, поскольку float всёравно хранится с N'ным кол-вом знаков в памяти.