Если не знать особенностей представления чисел на компьютере, то возможны очень интересные сюрпризы. Например, попробуем вычислить значения двух алгебраически абсолютно идентичных выражений и посмотрим, совпадут ли результаты:
Код:
var a=500000;
var expr1=a/(Math.pow(a+1,1/2)+Math.pow(a,1/2));
var expr2=a*(Math.pow(a+1,1/2)-Math.pow(a,1/2));
trace(expr1-expr2); // Выводит: 3.72591557606938e-9
Результаты расчетов по двум идентичным формулам различаются, пусть и не значительно.Аэто означает, что если бымыпытались установить факт равенства этих выражений, используя предложение if(), то вывод был бы сделан неверно, что связано с тем, что в ActionScript два числа равны только тогда, когда равенство соблюдается для всех разрядов.
Причиной появления ошибок, подобных описанной, является то, что числа сохраняются с ограниченной точностью. Конечно, 15 знаков мантиссы достаточно для большинства расчетов. Но в некоторых случаях ошибки округления способны накапливаться, искажая результат весьма значительно.
Особый случай представляют встроенные тригонометрические функции, результаты вычислений значений которых в точках нулей и разрывов практически никогда не совпадают с математически верными:
Код:
trace(Math.sin(Math.PI)); // Выводит: 1.22460635382238e-16 (нужно -0)
trace(Math.tan(Math.PI/2)); // Выводит: 1.63317787283838e+16 (нужно —
// Infinity)
Причиной появления не совсем правильных результатов в приведенных примерах является округление мантиссы чисел до 15 знаков. Справиться с этой проблемой непосредственным образом невозможно.