Просмотр полной версии : Math.sin(Math.PI) != 0
konstantin.noir
09.09.2008, 20:54
Здравствуйте.
Столкнулся с вот таким:
trace(Math.sin(Math.PI));
//выводит
//1.2246063538223773e-16
Как бороться с этим?
бороться с чем? с погрешностью? - <<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.
А здесь не так...
а вы себе представляете, сколько знаков после запятой у Math.PI и сколько знаков можно поместить в Number (float / double)?
konstantin.noir
09.09.2008, 21:43
Представлять - не представляю, но
trace(Math.sin(Math.PI/2));
//выводит
//1
Т.е. как я понял, никак - только проверять равно ли значение по синусом PI?
а как это связано?
В Number в дробную часть нельзя поместить больше 8 разрядов в шестнадцатеричной системе счисления, а пи - иррациональное число, и количество знаков после запятой бесконечно.
для наглядности:
trace(Math.sin(Math.PI).toFixed(8));
konstantin.noir
09.09.2008, 23:27
Спасибо. Просто думается, что такие очевидные вещи, как sin(PI) должны были бы быть реализованы как-то по-лучше.
CrazyFlasher
09.09.2008, 23:31
"что такое хорошо, а что такое плохо" каждый понимает по-разному ;-)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.