![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2006
Сообщений: 97
|
Hi!
здесь есть пример а как это обходить-то? *** ЗЫ что странно - через такую функцию работает roundTo = function (theNumber, decPlaces) {
if (decPlaces>=0) {
var temp = Math.pow(10, decPlaces);
return Math.round(theNumber*temp)/temp;
}
}
trace (roundTo((10.2 - 8.1), 2) == 2.1); //выводит true
trace (roundTo((8.52 - 8.51), 2) == 0.01); //выводит true
transit = function (tt){
String(tt);
return Number(tt)
}
trace(transit(10.2 - 8.1) == 2.1); //выводит false
![]() |
|
|||||
|
__________________
Насколько жизнь была бы проще, если она была в исходниках. |
|
|||||
|
Регистрация: Feb 2006
Сообщений: 97
|
AlexMatveev, пасибо!
Замечательно, во всё виноваты Винды и проц, ГЫ! Тепеть для "точных" вычисленией класс дописывать? на основе: Цитата:
может при использовании первой функции Флэш выставляет биты регистра control word в нужное состояние? |
|
|||||
|
Все потому же....
если взять и сделать так ![]() a = int((10.2-8.1)*10000000); trace (a) то получим, а = 20999999 а это значит что после вычисления (10.2-8.1) мы получаем не (2.1), а банально, но факт (2.0999999). А это соответственно не равно (2.1) Тут получается что все дробные вычисления надо делать через сдвиг разрядной сетки. -
__________________
Насколько жизнь была бы проще, если она была в исходниках. |
|
|||||
|
Регистрация: Feb 2006
Сообщений: 97
|
не понял, ты это к чему?
не, int - не туда округляет Туда окугляет Math.round(theNumber)][otia i bez nego Mo]|[no a = 10.2*10000; b = 8.1*10000; c = a - b; trace (c); //21000 trace (c == 21000); //true c = c/10000; trace (c);//2.1 Цитата:
>>>, >>, <<= эти? |
|
|||||
|
Регистрация: Feb 2006
Сообщений: 97
|
не понял, ты это к чему?
не, int - не туда округляет Туда окугляет Math.round(theNumber)][otia i bez nego Mo]|[no a = 10.2*10000; b = 8.1*10000; c = a - b; trace (c); //21000 trace (c == 21000); //true c = c/10000; trace (c);//2.1 Цитата:
>>>, >>, <<= эти? |
|
|||||
|
don't panic!
Регистрация: Aug 2001
Сообщений: 4,121
|
Цитата:
задача - сдвинуть разрядную сетку так, чтобы неточность вычислений _для нашей конкретной задачи_ не менялась при ошибках в числах с плавающей точкой. умножили всё на 10^N - получили сдвиг разрядной сетки на N разрядов (поскольку речь о десятичной системе). после округления ошибка никуда не денется (на то оно и округление), но просто будет пренебрежимо мала. кстати, вот тут, точно такая же тема рассматривалась. |
|
|||||
|
Регистрация: Jan 2006
Сообщений: 31
|
Если округления не нравятся можно через погрешность:
q = 10.2 - 8.1; eps=0.01; //погрешность trace(Math.abs(q-2.1)<eps); |
|
|||||
|
Один математик (к сожалению, не помню, кто) утверждал, что 0.9999... (0.(9)) в точности равняется единице. В смысле, не "приблизительно", а именно точно. И он смог это доказать! Доказательство было просто гениальным: "пойдем от обратного. Допустим не равны. Тогда пусть мне скажут, на сколько 1 превышает 0.999...". Ответ был очевиден. На 0.
В нашем случае все не совсем так, т.к. отличаются они в этом примере на 4.44089209850063e-16. Посему поддерживаю мысль о введении погрешности, но сделать ее порядка e-10 ![]()
__________________
...я люблю людей!.. |
![]() |
![]() |
Часовой пояс GMT +4, время: 08:05. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|