PDA

Просмотр полной версии : Math.sin(Math.PI) != 0


konstantin.noir
09.09.2008, 20:54
Здравствуйте.
Столкнулся с вот таким:

trace(Math.sin(Math.PI));

//выводит
//1.2246063538223773e-16


Как бороться с этим?

wvxvw
09.09.2008, 21:11
бороться с чем? с погрешностью? - <<0 или Number.toFixed(). зависит, от того, что нужно в итоге.

konstantin.noir
09.09.2008, 21:31
Мне нужно получить ряд значений, вычисляемых по формуле:

var __value:Number = Math.sin(Math.PI*(i/k));

где i:uint лежит в диапазоне от 0 до k (k - тоже uint)
Соответственно при значении i = k значение под знаком синуса равно:
Math.PI*(k/k) == Math.PI
Ну а синус от пи всегда был равен 0.
А здесь не так...

wvxvw
09.09.2008, 21:40
а вы себе представляете, сколько знаков после запятой у Math.PI и сколько знаков можно поместить в Number (float / double)?

konstantin.noir
09.09.2008, 21:43
Представлять - не представляю, но

trace(Math.sin(Math.PI/2));
//выводит
//1

Т.е. как я понял, никак - только проверять равно ли значение по синусом PI?

wvxvw
09.09.2008, 21:47
а как это связано?
В Number в дробную часть нельзя поместить больше 8 разрядов в шестнадцатеричной системе счисления, а пи - иррациональное число, и количество знаков после запятой бесконечно.

для наглядности:
trace(Math.sin(Math.PI).toFixed(8));

konstantin.noir
09.09.2008, 23:27
Спасибо. Просто думается, что такие очевидные вещи, как sin(PI) должны были бы быть реализованы как-то по-лучше.

CrazyFlasher
09.09.2008, 23:31
"что такое хорошо, а что такое плохо" каждый понимает по-разному ;-)