Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   как сравнивать?? если 9.45-9.44 != 0.01 (http://www.flasher.ru/forum/showthread.php?t=75997)

mrspb 24.02.2006 06:03

как сравнивать?? если 9.45-9.44 != 0.01
 
Hi!
здесь есть пример
Код:

q = 10.2 - 8.1;
 trace(q);
 trace(q == 2.1); //выводит false

а как это обходить-то?

***
ЗЫ
что странно - через такую функцию работает
Код:

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

,a через такую - нет
Код:

transit = function (tt){
        String(tt);
        return Number(tt)
}
trace(transit(10.2 - 8.1) == 2.1); //выводит false

:confused: :eek:

AlexMatveev 24.02.2006 13:10

http://www.flasher.ru/forum/showthread.php?t=59237

mrspb 24.02.2006 20:25

AlexMatveev, пасибо!
Замечательно, во всё виноваты Винды и проц, ГЫ!
Тепеть для "точных" вычисленией класс дописывать? на основе:
Цитата:

BrainSmasher
Кстати, что касается суммовых операций то тут все куда проще, смещаем принудительно разрядную сетку на 4 разряда (умножаем все суммы на 10000) а после любых вычислений делаем round результата, в итоге получаем целое число, которое точно представимо всегда (если не выходит за пределы разрядной сетки, но сильно я сомневаюсь что Вы оперируете подобными суммами
Я чё, подумал-то, у меня в первом посте две функции, обе возвращают одно и тоже число (2.1) но в одном случае сравнение прокатывает, а в другом - нет. А как сделать, чтоб в обоих случаях сравнение получалось???

может при использовании первой функции Флэш выставляет биты регистра control word в нужное состояние?

AlexMatveev 24.02.2006 21:17

Все потому же....
если взять и сделать так ;)

a = int((10.2-8.1)*10000000);
trace (a)

то получим, а = 20999999
а это значит что после вычисления (10.2-8.1) мы получаем не (2.1), а банально, но факт (2.0999999). А это соответственно не равно (2.1)

Тут получается что все дробные вычисления надо делать через сдвиг разрядной сетки.


-

mrspb 25.02.2006 05:26

не понял, ты это к чему?
не, int - не туда округляет :) Туда окугляет Math.round(theNumber)
Код:

c = Math.round((10.2-8.1)*10000);
trace (c) //21000
trace (c == 21000); //true

][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

но это долго
Цитата:

Сообщение от AlexMatveev
Тут получается что все дробные вычисления надо делать через сдвиг разрядной сетки

в каком смысле???
>>>, >>, <<= эти?

mrspb 25.02.2006 05:27

не понял, ты это к чему?
не, int - не туда округляет :) Туда окугляет Math.round(theNumber)
Код:

c = Math.round((10.2-8.1)*10000);
trace (c) //21000
trace (c == 21000); //true

][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

но так долго.
Цитата:

Сообщение от AlexMatveev
Тут получается что все дробные вычисления надо делать через сдвиг разрядной сетки

в каком смысле???
>>>, >>, <<= эти?

Nox Noctis 25.02.2006 19:46

Цитата:

Сообщение от mrspb
не, int - не туда округляет :) Туда окугляет Math.round(theNumber)

какая разница, чем округлять?

задача - сдвинуть разрядную сетку так, чтобы неточность вычислений _для нашей конкретной задачи_ не менялась при ошибках в числах с плавающей точкой. умножили всё на 10^N - получили сдвиг разрядной сетки на N разрядов (поскольку речь о десятичной системе). после округления ошибка никуда не денется (на то оно и округление), но просто будет пренебрежимо мала.

кстати, вот тут, точно такая же тема рассматривалась.

Kotenochek 26.02.2006 17:07

Если округления не нравятся можно через погрешность:

q = 10.2 - 8.1;
eps=0.01; //погрешность
trace(Math.abs(q-2.1)<eps);

K.A.T.A.F.A.L.K.E.R 26.02.2006 18:08

Один математик (к сожалению, не помню, кто) утверждал, что 0.9999... (0.(9)) в точности равняется единице. В смысле, не "приблизительно", а именно точно. И он смог это доказать! Доказательство было просто гениальным: "пойдем от обратного. Допустим не равны. Тогда пусть мне скажут, на сколько 1 превышает 0.999...". Ответ был очевиден. На 0. :D
В нашем случае все не совсем так, т.к. отличаются они в этом примере на 4.44089209850063e-16. Посему поддерживаю мысль о введении погрешности, но сделать ее порядка e-10 :)


Часовой пояс GMT +4, время: 17:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.