sword dancer Следующий :lol: Я тебе ответил на твой вопрос. Все нули в двоичном представлении, включая мантиссу = 0. А к мантиссе, кстати, слева автоматом подписывается единичка (которая ради экономии места не хранится).
есть. x=0; x1=10; y=0.5; В st2 загнан x, в St1 небольшая арифметическая операция, в St0 y. Нули во всех 80 битах означает ноль. Zero. То, что может сущствовать, и под что не отводится бит. Последний бит в целочисленной части отводят под знак.
AlexGousev регистр FPU состоит из 80 бит. тип float почти во всех ЯП равен 8 байтам (4 целая часть, 4 мантисса, он жн часто double. бывают типы с плавающей мантиссой либо просто увеличенной). бывают типы по 10 байт (например extended в компиляторе борланда), бывают 4 (как в данном примере - single, это 4 байта, 6-7 знаков после запятой). дальше бодаться будем? тот факт, что пхп что то там может не показывать или перепоказывать ни разу не отражается на истинном положении вещей на уровне мантисс, регистров и тыпы.
antonn Мы с тобой о разных вещах: о хранении числа с плавающей точкой и о его обработке. Та раскладка на 10 байт, что ты привел - она есть такая, да. Но в памяти число хранится в виде 4 байт для float и 8 для double. А FPU юзается не для вывода, а для действий над числами с плавающей точкой (сложение, умножение и т.п.). Как хочешь
это было к: понятие "архитектура", особенно в контексте битов и мантисс у всяких интерпритаторов отсутствует (либо на уровне байт-кода та же, что и у компилируемых, ведь к ним приводится все). 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, забыл слово блин ) ).
Интерпретатор очень правильно поступает (float)"" = 0 (float)"-"."" = -0 т.е раз уж -0 есть - все очень корректно И лишний повод посоветовать не приводить непроверенное непонятно-что к числовым типам
Ну то, что это дело интерпретатора как именно выводить эту последовательность бит - тут трудно спорить Это уж разработчик интерпретатора решает. Цимус темы был (как мне кажется) в том, чтобы понять причины того, почему он делает так, а не иначе. А зависимость разрядности int'а от архитектуры обычно в C и ему подобных скрывается defin'ами типов типа int8, int16 и т.д. В winapi есть BYTE, WORD, DWORD; как у них 64 бита - не знаю. PHP вообще слаботипизированный, о какой разрядности тут может быть речь?
ну я извращался, писал в бинарный файл, именно так как выше писал если есть в ПХП генерики (или в ОС, не знаю как реализованы типы данных внутри ПХП) - значит мне скоро не повезет byte, word (dword) - не generic type, это фундаментальные типы. поэтому я обожаю dword использую свой формат изображений (для быстрой работы средствами проца), там каждый пиксель dword (argb), никаких изголяний, все выровненно на 4 байта, ловко кладется в регистры MMX, быстро и красиво я вообще не могу понять, зачем искать смысл в том коде
Что касается целых чисел, то они точно используют int, соответствующий разрядности системы (точнее, libc). Это ты bmp изобрел Там вроде тоже заголовок и поток по n байт (от типа bmp зависит, в том числе и по 4 для rgba). Так топикстратер спросил, что за фигня творится
AlexGousev у bmp формат несколько более универсальный, но мне неудобный. Там к данным нужно добираться через заголовок в 31 байт, да еще строки расположены вверх ногами (плюс он там то dib, то ddb). Мой же более адаптированный к быстрым последовательным (да и не последовательным) операциям (но он только 32 битный, а ниже мне никчему), хотя система его и не знает и в конце концов его нужно вывести в bmp для показа А еще в нем внедрено архивное сжатие (дада, почти изобрел png ), качество сжатия почти rar, только чуть хуже.
MiksIr А как еще быть, если приходит непонятно что, а нужен именно числовой тип? Хорошо еще, что такая фигня возможна только с float-ом, что у целочисленных типов не бывает -0. А то ведь возможны уязвимости, например с LIMIT-ом в SQL...
AlexGousev С каких пор null стал числовым типом? К тому же от -0 твоя проверка не спасает все равно... antonn Аналогично
antonn Я еще раз для одаренных объясняю задачу: от пользователя приходит строка, а нужно число. Проверить число на валидность я смогу и без ваших регулярок, проверять эту валидность в отрыве от конкретной задачи - это и есть бред. Есть строка, нужно получить число. Все просто. Ваши нуллы, эксцепшны и прочие кудеса мне нафиг не нужны.
проверяется вышеперечисленными функциями, если это не число - пользователю фига. из буквы "Ч" числа не сделаешь. Это так, для одаренных.
antonn И что мне это даст? Раньше было приведение к типу + полноценная проверка. Ты предлагаешь дополнительно к полноценной проверке добавить еще одну - неполноценную (ибо задач приложения она не решает никак). Вместо одного ветвления алгоритма - два. А плюсов никаких. Мильен в поле "возраст" тоже как-то глупо пихать. Это так, для все тех же...
antonn Точно, пускай юзер пришлет 1000000000000000, значение пройдет все твои проверки, а потом в зависимости от контекста будет вести себя по-разному, ибо в int столько не влазит...
"значение" - это уже после проверки принадлежности к типу, когда ясно, что дали число. Это уже задача ограничивающих функций, которые проверят на валидность в конкретной ситуации