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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.04.2007, 12:35
~~~ вне форума Посмотреть профиль Отправить личное сообщение для ~~~ Посетить домашнюю страницу ~~~ Найти все сообщения от ~~~
  № 1  
Ответить с цитированием
~~~
 
Аватар для ~~~

блогер
Регистрация: Nov 2003
Адрес: 117593, Россия, Москва
Сообщений: 211
Записей в блоге: 2
Отправить сообщение для ~~~ с помощью ICQ Отправить сообщение для ~~~ с помощью AIM Отправить сообщение для ~~~ с помощью Yahoo Отправить сообщение для ~~~ с помощью Skype™
Question Бред какой-то!!! 18==18 //output :: false

Всем извесно, что квадрат гипотинузы равен сумме квадратов катитов (ещё в школе учили).

Код:
a = 3;
b = 3;
c = Math.sqrt((a*a)+(b*b));
trace(c*c+" = kvadrat gipotinuzy");
trace((a*a)+(b*b)+" = summa kvadratov katitov");
trace(c*c == (a*a)+(b*b));
__________________
WebLog:http://flashimp.ru
IDE: http://Visuvio.com

Старый 24.04.2007, 13:00
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
3*3+3*3 = 9+9 = 18. Квадратный корень из 18 ограничен по числу знаков. В AS3 точность выше и мы на выходе получаем 17.999999999999996, а не 18. Т.е. нужно округлять c*c до целого.

Старый 24.04.2007, 13:01
motor4ik вне форума Посмотреть профиль Отправить личное сообщение для motor4ik Посетить домашнюю страницу motor4ik Найти все сообщения от motor4ik
  № 3  
Ответить с цитированием
motor4ik
 
Аватар для motor4ik

Регистрация: Jun 2005
Адрес: Moscow - immigrate from Volgodonsk
Сообщений: 2,534
Код:
trace(String(c*c) == String((a*a)+(b*b)));
т.к. при
Код:
trace (c*c)
вы видете 18 а это именно
Код:
String(c*c)


Последний раз редактировалось motor4ik; 24.04.2007 в 13:03.
Старый 24.04.2007, 13:05
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Видимо, во внутреннем представлении все же идет на разделение операций с плавающей запятой и целочисленных.

Старый 24.04.2007, 13:11
0xFFFFFF вне форума Посмотреть профиль Отправить личное сообщение для 0xFFFFFF Посетить домашнюю страницу 0xFFFFFF Найти все сообщения от 0xFFFFFF
  № 5  
Ответить с цитированием
0xFFFFFF
† Таня Белая
 
Аватар для 0xFFFFFF

Регистрация: Mar 2006
Адрес: Москва
Сообщений: 929
Отправить сообщение для 0xFFFFFF с помощью ICQ Отправить сообщение для 0xFFFFFF с помощью Skype™
trace(Math.round(c*c) == Math.round((a*a)+(b*b))); // true
__________________
Flashress' Blogue

Старый 24.04.2007, 13:18
~~~ вне форума Посмотреть профиль Отправить личное сообщение для ~~~ Посетить домашнюю страницу ~~~ Найти все сообщения от ~~~
  № 6  
Ответить с цитированием
~~~
 
Аватар для ~~~

блогер
Регистрация: Nov 2003
Адрес: 117593, Россия, Москва
Сообщений: 211
Записей в блоге: 2
Отправить сообщение для ~~~ с помощью ICQ Отправить сообщение для ~~~ с помощью AIM Отправить сообщение для ~~~ с помощью Yahoo Отправить сообщение для ~~~ с помощью Skype™
Код:
a = 3;
b = 3;
c = Math.sqrt((a * a) + (b * b));
trace(c * c + " = kvadrat gipotinuzy");
trace((a * a) + (b * b) + " = summa kvadratov katitov");
trace(String(c * c) == String((a * a) + (b * b)));
-естественно true, а вот
Код:
trace(Number(c * c) == Number((a * a) + (b * b)));
-false
При таком раскладе к вычислению добавляется ещё строчка
Код:
c = Math.sqrt(Number(((a * a) + (b * b)).toString()));
Или это уже бред?

Math.round - не гарантирует идеальной точности вычислений, а хотелось бы к этой идеальности приблизиться
__________________
WebLog:http://flashimp.ru
IDE: http://Visuvio.com


Последний раз редактировалось etc; 24.04.2007 в 13:31.
Старый 24.04.2007, 13:30
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Пример:

Код:
a = 4.24264068711928*4.24264068711928;
b = 18;
c = 18;
trace(a==b); // false
trace(b==c); // true
В декомпиле:

Код:
    a = 18;
    b = 18;
    c = 18;
    trace (a == b);
    trace (b == c);
В реальности:
Код:
	constants 'a', 'b', 'c'
	push 'a', 18.00
	setVariable
	push 'b', 18
	setVariable
	push 'c', 18
	setVariable
	push 'a'
	getVariable
	push 'b'
	getVariable
	equals
	trace
	push 'b'
	getVariable
	push 'c'
	getVariable
	equals
	trace
	end
Как видим, 18.00 и 18 совсем не равны.

В байт коде:

push 'a', 18.00 это:
Код:
960B00080006FFFF3140F4FFFFFF
А push 'b', 18 это:
Код:
96070008010712000000
И, наконец, push 'c', 18 это:
Код:
96070008020712000000
Как видно, последние два push имеют тип 07h, т.е. integer, целое число. А в первом случае 06h (видимо, double 64bit). В общем, особо не разбирался да и лень.
Идеальной точности не добиться. Особенно при работе с корнями.


Последний раз редактировалось etc; 24.04.2007 в 13:44.
Старый 24.04.2007, 13:41
~~~ вне форума Посмотреть профиль Отправить личное сообщение для ~~~ Посетить домашнюю страницу ~~~ Найти все сообщения от ~~~
  № 8  
Ответить с цитированием
~~~
 
Аватар для ~~~

блогер
Регистрация: Nov 2003
Адрес: 117593, Россия, Москва
Сообщений: 211
Записей в блоге: 2
Отправить сообщение для ~~~ с помощью ICQ Отправить сообщение для ~~~ с помощью AIM Отправить сообщение для ~~~ с помощью Yahoo Отправить сообщение для ~~~ с помощью Skype™
__etc, супер, всё, прям, популярнинько разложил! Спасибо!
А я чего-то сам на байт-код не додумался взглянуть...
__________________
WebLog:http://flashimp.ru
IDE: http://Visuvio.com

Старый 24.04.2007, 14:26
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 9  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Cамый простой пример:
Код:
a = 3;
b = 3;
c = Math.sqrt ((a * a) + (b * b));
trace (18 - c * c);
trace (18 - (a * a) + (b * b));
Проблемы с точностью вычислений (причем это касается не только флеша, но и яваскрипт и пхп) уже не раз на форуме обсуждалась.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 24.04.2007, 14:50
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Цитата:
Math class are emulated using approximations and might not be as accurate as .... blah-blah
Эта строчка присутствует в описании практически всех методов Math... Так что, нас предупреждали =)
__________________
Hell is the possibility of sanity

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

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

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


 


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


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