Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2008, 16:58   #1
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию Сравнение чисел с плавающей точкой ?

Подскажите пожалуйста, как на MASM_e
наиболее эффективно сравнить два числа
с плавающей точкой ?

Я делаю это так:
Код:
fld	[ValueX]
fcom	[ValueY]
fstsw	ax
and	eax, 00004500h
cmp	eax, 00000000h
je	Rezult1		;- если X>Y
cmp	eax, 00000100h
je	Rezult2		;- если X<Y
cmp	eax, 00004000h
je	Rezult3		;- если X=Y
cmp	eax, 00004500h
je	RezultErr	;- их нельзя было сравнивать
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось rpy3uH; 13.04.2008 в 15:24.
Ulex вне форума Ответить с цитированием
Старый 12.04.2008, 17:20   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Что значит наиболее эффективно?? Так и сравнивать. Только может быть стоит cmp на test поменять, а "and eax, 00004500h" выкинуть, и FUCOM вместо FCOM, чтобы по NaN-ам прерывание не поднимать. И несравнимые - это 0400h.
B_N вне форума Ответить с цитированием
Старый 12.04.2008, 17:38   #3
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Ну мне наиболее быстрый способ нужен..

Простите-извините , а что такое NaN-ам прерывание ??

А почему 0400h - несравнимые:

The condition codes for FCOM are as follows:

C3 C2 C1 C0 Meaning

0 0 ? 0 ST > source
0 0 ? 1 ST < source
1 0 ? 0 ST = source
1 1 ? 1 ST not comparable to source
-o-

Разве (1 1 ? 1 ST not comparable to source) - это не 4500h
в AX ?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 12.04.2008, 17:55   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Чего это у Вас за табличка такая? Я смотрю вот сюда:
http://img149.imageshack.us/my.php?image=new2xe1.png
А 1-1-1 вроде бы когда source=NaN.
B_N вне форума Ответить с цитированием
Старый 12.04.2008, 18:14   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

У меня табличка из файла FPHELP.HLP - справка, которая вместе с
компилятором шла.
А вообще я может чего-то понапутал с положением бит C0, C1, C2, C3 в
AX?
Я полагал так - C0-8-ой, C1-9-ый, C2-10-ый, C3-14-ый, или я не прав?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 12.04.2008, 18:29   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Ulex Посмотреть сообщение
Я полагал так - C0-8-ой, C1-9-ый, C2-10-ый, C3-14-ый, или я не прав?
Вообще-то - да....
http://img229.imageshack.us/my.php?image=new3xm5.png
http://img229.imageshack.us/my.php?image=new4mr8.png

Чего-то я уже тоже запутался...
B_N вне форума Ответить с цитированием
Старый 12.04.2008, 19:12   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Вон чего ещё нашел:

Код:
fld	[ValueX]
fcom	[ValueY]
fstsw	ax
sahf
jl	Rezult1	-если X<Y
jnle	Rezult2	-если X>Y
je	Rezult3	-если X=Y
jp	Error	-переход по "плохому" операнду в команде fcom
А у В.Пирогова почему-то написано, что команда sahf устарела ??
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось rpy3uH; 13.04.2008 в 15:26.
Ulex вне форума Ответить с цитированием
Старый 12.04.2008, 19:32   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Ulex Посмотреть сообщение
Вон чего ещё нашел:

fld [ValueX]
fcom [ValueY]
fstsw ax
sahf
jl Rezult1 -если X<Y
jnle Rezult2 -если X>Y
je Rezult3 -если X=Y
jp Error -переход по "плохому" операнду в команде fcom
Тоже вариант, в принципе. Только его, наверное, померять стоит, с короткими регистрами процессор медленно работает...
Цитата:
Сообщение от Ulex Посмотреть сообщение
А у В.Пирогова почему-то написано, что команда sahf устарела ??
Ну так пушшай он об ентом в Интел напишет!
B_N вне форума Ответить с цитированием
Старый 12.04.2008, 20:29   #9
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

У меня всё неправильно
Правильно так:
Код:
fld [ValueX]
fcom [ValueY]
fstsw ax
sahf
jb Rezult1 -если X<Y
ja Rezult2 -если X>Y
jnb Rezult3 -если X=Y
jp Error -переход по "плохому" операнду в команде fcom
Кстати, померял ... (На 1300 Celeron_e при 500.000.000 циклов
сложения + сравнения)

вариант1 -
Код:
start_job:
	fadd	[J_float32]
	fcom	[G_float32]
	fstsw	ax
	sahf
	jb	start_job - даёт ~2614 mS
вариант2 -
Код:
start_job:
	fadd	[J_float32]
	fcom	[G_float32]
	fstsw	ax
	and eax, 00004500h
	cmp eax, 00000100h
	je start_job - даёт ~2854 mS
Первый типа быстрее
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось rpy3uH; 13.04.2008 в 15:27.
Ulex вне форума Ответить с цитированием
Старый 12.04.2008, 20:33   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Ну зачем Вам
Код:
and eax, 00004500h
cmp eax, 00000100h
?
Поменяйте Вы его на
Код:
test eax, 00000100h
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сложить два числа с плавающей точкой forsy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 29.03.2010 02:15
Преобразование числа с плавающей точкой в строку Sibedir Общие вопросы Delphi 14 09.03.2008 21:48
Числа с плавающей точкой Blondinka Общие вопросы Delphi 8 21.09.2007 11:32