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

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

Код:
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.