Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.02.2006, 06:03
mrspb вне форума Посмотреть профиль Отправить личное сообщение для mrspb Найти все сообщения от mrspb
  № 1  
Ответить с цитированием
mrspb

Регистрация: Feb 2006
Сообщений: 97
По умолчанию как сравнивать?? если 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

Старый 24.02.2006, 13:10
AlexMatveev вне форума Посмотреть профиль Отправить личное сообщение для AlexMatveev Посетить домашнюю страницу AlexMatveev Найти все сообщения от AlexMatveev
  № 2  
Ответить с цитированием
AlexMatveev

Регистрация: Jun 2003
Адрес: Minsk
Сообщений: 58
Отправить сообщение для AlexMatveev с помощью ICQ
http://www.flasher.ru/forum/showthread.php?t=59237
__________________
Насколько жизнь была бы проще, если она была в исходниках.

Старый 24.02.2006, 20:25
mrspb вне форума Посмотреть профиль Отправить личное сообщение для mrspb Найти все сообщения от mrspb
  № 3  
Ответить с цитированием
mrspb

Регистрация: Feb 2006
Сообщений: 97
AlexMatveev, пасибо!
Замечательно, во всё виноваты Винды и проц, ГЫ!
Тепеть для "точных" вычисленией класс дописывать? на основе:
Цитата:
BrainSmasher
Кстати, что касается суммовых операций то тут все куда проще, смещаем принудительно разрядную сетку на 4 разряда (умножаем все суммы на 10000) а после любых вычислений делаем round результата, в итоге получаем целое число, которое точно представимо всегда (если не выходит за пределы разрядной сетки, но сильно я сомневаюсь что Вы оперируете подобными суммами
Я чё, подумал-то, у меня в первом посте две функции, обе возвращают одно и тоже число (2.1) но в одном случае сравнение прокатывает, а в другом - нет. А как сделать, чтоб в обоих случаях сравнение получалось???

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

Старый 24.02.2006, 21:17
AlexMatveev вне форума Посмотреть профиль Отправить личное сообщение для AlexMatveev Посетить домашнюю страницу AlexMatveev Найти все сообщения от AlexMatveev
  № 4  
Ответить с цитированием
AlexMatveev

Регистрация: Jun 2003
Адрес: Minsk
Сообщений: 58
Отправить сообщение для AlexMatveev с помощью ICQ
Все потому же....
если взять и сделать так

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

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

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


-
__________________
Насколько жизнь была бы проще, если она была в исходниках.

Старый 25.02.2006, 05:26
mrspb вне форума Посмотреть профиль Отправить личное сообщение для mrspb Найти все сообщения от mrspb
  № 5  
Ответить с цитированием
mrspb

Регистрация: Feb 2006
Сообщений: 97
не понял, ты это к чему?
не, 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
Тут получается что все дробные вычисления надо делать через сдвиг разрядной сетки
в каком смысле???
>>>, >>, <<= эти?

Старый 25.02.2006, 05:27
mrspb вне форума Посмотреть профиль Отправить личное сообщение для mrspb Найти все сообщения от mrspb
  № 6  
Ответить с цитированием
mrspb

Регистрация: Feb 2006
Сообщений: 97
не понял, ты это к чему?
не, 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
Тут получается что все дробные вычисления надо делать через сдвиг разрядной сетки
в каком смысле???
>>>, >>, <<= эти?

Старый 25.02.2006, 19:46
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 7  
Ответить с цитированием
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
Цитата:
Сообщение от mrspb
не, int - не туда округляет :) Туда окугляет Math.round(theNumber)
какая разница, чем округлять?

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

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

Старый 26.02.2006, 17:07
Kotenochek вне форума Посмотреть профиль Отправить личное сообщение для Kotenochek Найти все сообщения от Kotenochek
  № 8  
Ответить с цитированием
Kotenochek

Регистрация: Jan 2006
Сообщений: 31
Если округления не нравятся можно через погрешность:

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

Старый 26.02.2006, 18:08
K.A.T.A.F.A.L.K.E.R вне форума Посмотреть профиль Отправить личное сообщение для K.A.T.A.F.A.L.K.E.R Найти все сообщения от K.A.T.A.F.A.L.K.E.R
  № 9  
Ответить с цитированием
K.A.T.A.F.A.L.K.E.R
 
Аватар для K.A.T.A.F.A.L.K.E.R

Регистрация: Jul 2005
Адрес: Go, Ukraine!
Сообщений: 787
Отправить сообщение для K.A.T.A.F.A.L.K.E.R с помощью ICQ
Один математик (к сожалению, не помню, кто) утверждал, что 0.9999... (0.(9)) в точности равняется единице. В смысле, не "приблизительно", а именно точно. И он смог это доказать! Доказательство было просто гениальным: "пойдем от обратного. Допустим не равны. Тогда пусть мне скажут, на сколько 1 превышает 0.999...". Ответ был очевиден. На 0.
В нашем случае все не совсем так, т.к. отличаются они в этом примере на 4.44089209850063e-16. Посему поддерживаю мысль о введении погрешности, но сделать ее порядка e-10
__________________
...я люблю людей!..

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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