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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.02.2008, 18:47
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 1  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
По умолчанию Баг с простыми арифметическими действиями (приведение типов)?

Код:
class rendering.Line {

	private var __a:PNT;
	private var __b:PNT;
	
	private var __length:Number = Number.NaN;
	private var __height:Number = Number.NaN;
	private var __width:Number = Number.NaN;
	private var __angle:Number = Number.NaN;
	
	public function Line(pa:PNT, pb:PNT) {
		__a = pa;
		__b = pb;
		__width = __b.x - __a.x;
		__height = __b.y - __a.y;
		trace(pa.x + ' : ' + pa.y + ' : ' + pb.x + ' : ' + pb.y);
		trace(__b.x == __a.x);
		trace('angle: ' + __angle + ' : ' + __height + ' : ' + __width);
		__length = Math.sqrt(__width * __width + __height * __height);
		__angle = Math.atan(__width / __height);
	}
}
Код:
class rendering.PNT extends Array {

	public function PNT(xx:Number, yy:Number) {
		this.push(xx);
		this.push(yy);
	}
	
	public function set x(p:Number):Void {
		this[0] = Math.round(p);
	}
	public function get x():Number {
		return this[0];
	}
	public function set y(p:Number):Void {
		this[1] = Math.round(p);
	}
	public function get y():Number {
		return this[1];
	}
}
Похоже на баг компайлера... или я чего-то не понимаю =/

Уже чего только не делал...
Код:
new Line(new PNT(130,130), new PNT(30,130));
И в трейс выдается:
angle: NaN : -2.8421709430404e-14 : -100
(вместо -2.8421709430404e-14 должно быть 0)
__________________
Hell is the possibility of sanity

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Мой трейс
Цитата:
130 : 130 : 30 : 130
false
angle: NaN : 0 : -100
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

Регистрация: Jul 2006
Адрес: Питер
Сообщений: 2,083
Отправить сообщение для MrPoma с помощью Skype™
опустите трейс в низ конструктора и будет вам сказка

в результате трейс:
Цитата:
130 : 130 : 30 : 130
false
angle: -1.5707963267949 : 0 : -100

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Перезапустил комп... откомпилировал флешем и мтаском... по прежнему такой же результат... Самое непонятное, что с некоторыми числами проблем не возникает =/

Цитата:
опустите трейс в низ конструктора и будет вам сказка

в результате трейс:
А при чем то, где находится трейс? Мне угол не интересен... Плохо то, что 130-130 почему-то получается -2.8421709430404e-14, а не 0...
__________________
Hell is the possibility of sanity

Старый 06.02.2008, 19:25
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 5  
Ответить с цитированием
chingachgoog
Banned
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от wvxvw
Плохо то, что 130-130 почему-то получается -2.8421709430404e-14, а не 0...
Мантисса 15 знаков...

Цитата:
Сообщение от Гурский
Если не знать особенностей представления чисел на компьютере, то возможны очень интересные сюрпризы. Например, попробуем вычислить значения двух алгебраически абсолютно идентичных выражений и посмотрим, совпадут ли результаты:
Код:
var a=500000;
var expr1=a/(Math.pow(a+1,1/2)+Math.pow(a,1/2));
var expr2=a*(Math.pow(a+1,1/2)-Math.pow(a,1/2));
trace(expr1-expr2); // Выводит: 3.72591557606938e-9
Результаты расчетов по двум идентичным формулам различаются, пусть и не значительно.Аэто означает, что если бымыпытались установить факт равенства этих выражений, используя предложение if(), то вывод был бы сделан неверно, что связано с тем, что в ActionScript два числа равны только тогда, когда равенство соблюдается для всех разрядов.
Причиной появления ошибок, подобных описанной, является то, что числа сохраняются с ограниченной точностью. Конечно, 15 знаков мантиссы достаточно для большинства расчетов. Но в некоторых случаях ошибки округления способны накапливаться, искажая результат весьма значительно.

Особый случай представляют встроенные тригонометрические функции, результаты вычислений значений которых в точках нулей и разрывов практически никогда не совпадают с математически верными:
Код:
trace(Math.sin(Math.PI)); // Выводит: 1.22460635382238e-16 (нужно -0)
trace(Math.tan(Math.PI/2)); // Выводит: 1.63317787283838e+16 (нужно —
// Infinity)
Причиной появления не совсем правильных результатов в приведенных примерах является округление мантиссы чисел до 15 знаков. Справиться с этой проблемой непосредственным образом невозможно.

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Числа которые передавались в "new Line(new PNT(..." были получены в результате неких мат операций, но для примера ты вывел их в трейс и дал их нам, а сам продолжаешь использовать результаты мат операций?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
chingachgoog, дело не в этом, а в том, что в трейс идет число округленное, а в расчетах участвует дробное.
Вот пример где после запятой всего 13 знаков.
Код:
a = 130;
b = 130;
d = b + 0.0000000000001;
trace (d + " - " + a + " = " + (d - a));
и результат
Цитата:
130 - 130 = 1.13686837721616e-13
2 wvxvw: в классе PNT для сеттеров стоит округление для вновь вводимых значениях, а в конструкторе - нет.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ой... всем спасибо =) Нужно было в геттере округлять, а не в сеттере... невнимательность
__________________
Hell is the possibility of sanity

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от wvxvw
Ой... всем спасибо =) Нужно было в геттере округлять, а не в сеттере... невнимательность
Я бы оставил в сеттере, вместо того, чтобы при каждов запросе делать округление повторно, что явно производительности не прибавит. И в конструкторе бы округление сделал.

...однако мне не понятно, что было расширять здесь Array, когда нужно расширить Point.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
С первым согласен, да, правельнее будет в конструкторе округлить.
А массив - потому что в других местах понадобятся некоторые его свойства, типа конкантенации, например. А в Point есть куча всего, что я не собираюсь использовать.
__________________
Hell is the possibility of sanity

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

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

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


 


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


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