За последние 24 часа нас посетили 16922 программиста и 1646 роботов. Сейчас ищут 903 программиста ...

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

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

  1. sword dancer

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

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    - доктор, меня все игнорируют!!!!
    - ...
     
  2. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    sword dancer
    Следующий :lol:
    Я тебе ответил на твой вопрос. Все нули в двоичном представлении, включая мантиссу = 0.
    А к мантиссе, кстати, слева автоматом подписывается единичка (которая ради экономии места не хранится).
     
  3. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    есть.
    [​IMG]
    x=0;
    x1=10;
    y=0.5;
    В st2 загнан x, в St1 небольшая арифметическая операция, в St0 y. Нули во всех 80 битах означает ноль. Zero. То, что может сущствовать, и под что не отводится бит.
    Последний бит в целочисленной части отводят под знак.
     
  4. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    antonn
    где ты во float'е 10 байт нашел?
     
  5. kostyl

    kostyl Guest

    вообще ниче непойму о чём тута реч?
     
  6. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    AlexGousev
    регистр FPU состоит из 80 бит.
    тип float почти во всех ЯП равен 8 байтам (4 целая часть, 4 мантисса, он жн часто double. бывают типы с плавающей мантиссой либо просто увеличенной). бывают типы по 10 байт (например extended в компиляторе борланда), бывают 4 (как в данном примере - single, это 4 байта, 6-7 знаков после запятой).
    дальше бодаться будем? :)

    тот факт, что пхп что то там может не показывать или перепоказывать ни разу не отражается на истинном положении вещей на уровне мантисс, регистров и тыпы.
     
  7. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    antonn
    Мы с тобой о разных вещах: о хранении числа с плавающей точкой и о его обработке. Та раскладка на 10 байт, что ты привел - она есть такая, да. Но в памяти число хранится в виде 4 байт для float и 8 для double. А FPU юзается не для вывода, а для действий над числами с плавающей точкой (сложение, умножение и т.п.).

    Как хочешь :)
     
  8. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    это было к:
    понятие "архитектура", особенно в контексте битов и мантисс у всяких интерпритаторов отсутствует (либо на уровне байт-кода та же, что и у компилируемых, ведь к ним приводится все). float может быть равен нулю. А так же -0, если это допускает среда расчета (т.е. она схавает минус, а не автоматически скинет знаковый бит, потому что посчитает что ноль - число беззнаковое) либо архитектура АЛУ с FPU.

    Так же, опять, замечу, что не стоит рассуждать о внутреннем строении на основании результатов неких опытов, нужно просто посмотреть (ну под отладчиком, чтоли, если в мануале нету...). К тому же может быть глубоко пофиг на меньшую разрядность чисел (как целочисленных так и нет) при бОльшем возможном. Т.е. float запросто может храниться в double, а в usermode просто притворяться им (в памяти интерпритатора он выровнен с остальными double, в использовании он 4 байта), и ничего не случится, потому что все они бегают по одним и тем же регистрам.
    к тому же есть и generic type, это типы зависящие от разрядности системы (так в борландском компиляторе integer - такой тип, на 32 битной ОС он 4 байта, на 64 битной - 8). Разница в таких типах будет видна юзеру если он использует такие числа совместно с их длиной (например запись в бинарный файл, файл сохраненный под 32битной ОС не прочтется правильно под 64й, потому что тип стал больше). Если работать с такими числами примерно так: a+b=c, то юзеру вообще пофиг на все эти навороты. Интерпритатор ПХП тем и хорош, что достаточно знать основы работы с числами (ну длина, точность и прочее) и не задумываться о их приведении в простом коде (если везде руками тупо не приводить. Я тут посмотрел про автоприведение single к double (4 байта к 8), как они предварительно по регистрам раскидываются и в общий складываются - это кабздец какой то, ну их нафиг, лучше не думать :) ), вообще плавающие типы дают свободу и легкость, но они и скрывают внутреннее строение (которое, вообще то, пофиг должно быть :) ).

    Я вообще не пойму в чем цимус этой темы, ну есть код некий, который выдает непонятый кому то результат, зачем углубляться куда то и твердить, как интерпритатор "должен" был поступить, вроде на "должен" применительно к такому случаю нет официального положения (что ли rfc, забыл слово блин :)) ).
     
  9. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Интерпретатор очень правильно поступает ;)
    (float)"" = 0
    (float)"-"."" = -0
    т.е раз уж -0 есть - все очень корректно ;)
    И лишний повод посоветовать не приводить непроверенное непонятно-что к числовым типам ;)
     
  10. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ну то, что это дело интерпретатора как именно выводить эту последовательность бит - тут трудно спорить :) Это уж разработчик интерпретатора решает.

    Цимус темы был (как мне кажется) в том, чтобы понять причины того, почему он делает так, а не иначе.

    А зависимость разрядности int'а от архитектуры обычно в C и ему подобных скрывается defin'ами типов типа int8, int16 и т.д. В winapi есть BYTE, WORD, DWORD; как у них 64 бита - не знаю.

    PHP вообще слаботипизированный, о какой разрядности тут может быть речь?
     
  11. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    ну я извращался, писал в бинарный файл, именно так как выше писал :)
    если есть в ПХП генерики (или в ОС, не знаю как реализованы типы данных внутри ПХП) - значит мне скоро не повезет :)

    byte, word (dword) - не generic type, это фундаментальные типы. поэтому я обожаю dword :) использую свой формат изображений (для быстрой работы средствами проца), там каждый пиксель dword (argb), никаких изголяний, все выровненно на 4 байта, ловко кладется в регистры MMX, быстро и красиво :)

    я вообще не могу понять, зачем искать смысл в том коде :)
     
  12. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Что касается целых чисел, то они точно используют int, соответствующий разрядности системы (точнее, libc).

    Это ты bmp изобрел :) Там вроде тоже заголовок и поток по n байт (от типа bmp зависит, в том числе и по 4 для rgba).

    Так топикстратер спросил, что за фигня творится :)
     
  13. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    AlexGousev
    у bmp формат несколько более универсальный, но мне неудобный. Там к данным нужно добираться через заголовок в 31 байт, да еще строки расположены вверх ногами (плюс он там то dib, то ddb). Мой же более адаптированный к быстрым последовательным (да и не последовательным) операциям (но он только 32 битный, а ниже мне никчему), хотя система его и не знает и в конце концов его нужно вывести в bmp для показа :)
    А еще в нем внедрено архивное сжатие (дада, почти изобрел png :) ), качество сжатия почти rar, только чуть хуже.
     
  14. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    MiksIr
    А как еще быть, если приходит непонятно что, а нужен именно числовой тип?
    Хорошо еще, что такая фигня возможна только с float-ом, что у целочисленных типов не бывает -0. А то ведь возможны уязвимости, например с LIMIT-ом в SQL...
     
  15. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    MiksIr
    Хах, ну тогда уж:
    ;)
     
  16. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1. <?php
    2. $price = preg_match('%-?\d+(\.\d+)?%' $_GET['price']) ? (float)$_GET['price'] : null;
    3. ?>
     
  17. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    еще была функция is_numeric() и подобные
     
  18. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    AlexGousev
    С каких пор null стал числовым типом?
    К тому же от -0 твоя проверка не спасает все равно...
    antonn
    Аналогично
     
  19. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Dagdamor
    что аналогично? есть is_int, is_float.
    а тупо приводить данные к типу - это бред.
     
  20. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    antonn
    Я еще раз для одаренных объясняю задачу: от пользователя приходит строка, а нужно число. Проверить число на валидность я смогу и без ваших регулярок, проверять эту валидность в отрыве от конкретной задачи - это и есть бред. Есть строка, нужно получить число. Все просто. Ваши нуллы, эксцепшны и прочие кудеса мне нафиг не нужны.
     
  21. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    проверяется вышеперечисленными функциями, если это не число - пользователю фига.
    из буквы "Ч" числа не сделаешь.
    Это так, для одаренных.
     
  22. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    antonn
    И что мне это даст? Раньше было приведение к типу + полноценная проверка. Ты предлагаешь дополнительно к полноценной проверке добавить еще одну - неполноценную (ибо задач приложения она не решает никак). Вместо одного ветвления алгоритма - два. А плюсов никаких.
    Мильен в поле "возраст" тоже как-то глупо пихать. Это так, для все тех же...
     
  23. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    начала проверка принадлежности к типу, а дальше даже можно насильно не приводить
     
  24. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    antonn
    Точно, пускай юзер пришлет 1000000000000000, значение пройдет все твои проверки, а потом в зависимости от контекста будет вести себя по-разному, ибо в int столько не влазит...
     
  25. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    "значение" - это уже после проверки принадлежности к типу, когда ясно, что дали число. Это уже задача ограничивающих функций, которые проверят на валидность в конкретной ситуации