Показать сообщение отдельно
Старый 29.08.2012, 01:16
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 5  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
http://habrahabr.ru/post/112953/ http://habrahabr.ru/post/130272/ Такое поведение не просто есть, а оно строго регламентировано стандартом, имя ему IEEE 754. И на самом деле, процессор даже ему не следует обычно, но делает что-то похожее. Чтобы сторого следовать стандарту надо сказать об этом процессору и тогда операции будут медленнее но строго соответствовать стандарту(но не вашим ожиданиям) т.к. некоторые значения конечных дробей в десятичной системе в двоичной бесконечны, и наоборот. Кстати из экшнскрипта заставить процессор строго следовать стандарту не получится.

Добавлено через 1 минуту
http://habrahabr.ru/post/123883/ вот ещё, комменты тоже полезны

Добавлено через 6 минут
Более того, от порядка вычисления зависит результат.
Код AS3:
var a:Number = (2+3)/7;
var b:Number = (2/7) + (3/7);
trace(a==b,a,b);
будет

Код:
false 0.7142857142857143 0.7142857142857142
Добавлено через 15 минут
Это непосредственно следует из того что точность чисел с плавающей точкой зависит от размера хранимого числа, т.е. на очень маленьких (сильно близких к нулю) и на очень больших (близких к положительной или отрицательной границе типа(часто, но ошибочно, называют бесконечностями, обозначаются +inf и -inf)) точность плохая. Так вот точность всегда плавает от размера хранимого значения, и в примере выше промежуточные результаты имеют разное значение, в первом случае пятёрка делится на 7, а во втором 2 и 3, и оба деления результаты меньше 1. Иногда совпадают, а иногда и нет. Обратите внимание в каком знаке отличие и нужна ли вам такая точность? Как правило нет. А вот если нужна то тогда применяют числа с фиксированной запятой. При том же объёме занимаемой памяти они могут хранить сильно меньший диапазон значений, но в то же время их точность фиксирована и предсказуема, а операции детерминированы(но от порядка вычислений тоже может зависеть результат, если на промежуточных значениях будут разные выходы за пределы точности). Например фиксированная запятая применяется в видеообработке для задания частоты кадров, т.к. если она будет плавать видно этого сразу не будет но видео будет плохо восприниматься. В частности в формате swf фреймрейт записан именно в формате с фиксированной запятой, что гарантирует ожидаемую точность без подвохов. Никак и ничто не может быть представлено с абсолютной точностью, вопрос в том какая будет ошибка и насколько она предсказуема.

Добавлено через 20 минут
Собственно формат то называется плавающая точка потому что точность плавает. Потому что когда вы считаете миллиарды +- одна тысячная обычно не важна, а если считаете около единицы, то одна тысячная как правило важнее.
__________________
:)