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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2012, 21:23   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Сравнение вещественных чисел.

Недавно столкнулся с вещественными числами. Все было хорошо, до того как потребовалось их сравнить. Начну со статьи. http://forum.vingrad.ru/topic-237927.html Обратите внимание на второе сообщение. В нем рассказывается о командах сопроцессора.
Рассмотрим первые из них: FCOM (FCOMP, FCOMPP, FICOM, FICOMP)
После этих инструкций нужно использовать еще две FSTSW и SAHF(не могу понять: почему бы для этого не сделать одну инструкцию?) И здесь есть одно но. Здесь(кликабельно) говорится о том что не получится использовать команду jg, вместо нее лучше ja, которая сравнивает числа без знака. Главный вопрос: а если мне нужно учесть знак, то как поступить?
Ладно, теперь перейдем ко второй группе команд: FUCOM (FUCOMP, FUCOMPP) Они работают без инструкций FSTSW и SAHF. Есть ли недостатки в сравнении с FCOM и т.п? Если да, то какие? Что-то очень сильно я запутался.
Заранее благодарю.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 19.09.2012, 04:20   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

_PROGRAMM_
И что там было непонятно? Я еще упоминал FTST и FXAM, если не хочешь париться с командой SAHF и переводить флаги сопроцессора в соответствующие биты EFLAGS используй команды FCOMI, FCOMIP, FUCOMI, FUCOMIP, после них можно использовать команды условного перехода типа jl, je и т.д., а чтобы понять отрицательное вещественное число или положительное достаточно получить значение ее старшего бита, если =1, то отрицательное, проверку на ноль тоже можно упростить, так как вещественный 0.0 и целочисленный 0 это одно и тоже!
Mikl___ вне форума Ответить с цитированием
Старый 19.09.2012, 07:18   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Т.е. для того, чтобы сравнить числа, мне придется придумывать логику их сравнения? Что-то я не пойму. Если мне, например, нужно сравнить 0.5 с заведомо неизвестным(x) и узнать: это неизвестное больше 0,5 или меньше. Нужно будет сначала сравнить знак, если x отрицательное, то оно меньше, если x=0(получается еще одно сравнение и флаги сбросятся) и только после этого сравнивать инструкциями ja je? Вы упомянули о jl следовательно сравнение со знаком можно выполнять ею?
Или есть какой-то другой, более рациональный, способ? Вообще какие инструкции сравнения использовать можно, а какие - нет?
Цитата:
после них можно использовать команды условного перехода типа jl, je
А инструкции FCOM,FSTSW,SAHF этого не позволяют?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 19.09.2012 в 07:23.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 19.09.2012, 11:20   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

_PROGRAMM_, нет не то
если я хочу узнать, что вещественное число Y меньше нуля, то не прибегая к FCOM я могу написать
Код:
test Y,800000000h
jz число_положительное
, если я хочу проверить на равенство с нулем
Код:
cmp Y,0
jz Y_равно_нулю
все эти приседания со сравнениями возникли потому, что до 486 процессора сопроцессор был отдельным устройством, а вообще если мои разяснения непонятны почитай Юрий Магда - "Ассемблер для процессоров Intel Pentium" Издательство: Питер 2006, или Калашникова или Ассемблер IA-32. Вещественная арифметика
Mikl___ вне форума Ответить с цитированием
Старый 19.09.2012, 14:24   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

для сравнения можно использовать все, что душа пожелает.
хотя я бы рекомендовал использование FCOMI(FCOMIP/ FUCOMI/FUCOMIP), которая ставит EFLAGS, на мой взляд, это удобно, потому что можно использовать Jcc без проверки FPU статуса.

книжка учит, что единственая раница между FCOMI И FUCOMI это отношение к NaN и неправильному формату. FCOMI дает исключение всегда когда содержание одного из регистров в неправильном формате или NaN. FUCOMI дает ислючение только, когда оба регистра в неправильном формате или NaN, а также в том случае если один из регистров содержит SNaN.

2Mikl___
по мелочам:
в первом тесте лишний 0.
в 32-х битном режиме будет работать только с single precision.

второй смр даст неправильный результат для -0.0

Цитата:
что до 486 процессора сопроцессор был отдельным устройством
че-то не понял, а что собственно изменилось? они перешли на новый техпроцесс и запихнули CPU и FPU в одну коробку?

Последний раз редактировалось f.hump; 19.09.2012 в 15:18.
f.hump вне форума Ответить с цитированием
Старый 19.09.2012, 20:37   #6
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо за помощь. Для заключения скажу, что очень много знаний дала мне книга, прочитать которую предложил Mikl___(не разрешают + поставить), Юрий Магда - "Ассемблер для процессоров Intel Pentium". Тем кто попадет сюда через поиск, советую почитать. Хотя бы о сопроцессоре.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 19.09.2012 в 20:40.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 20.09.2012, 03:58   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
а что собственно изменилось? они перешли на новый техпроцесс и запихнули CPU и FPU в одну коробку?
Да, начиная с 486 CPU и FPU находятся на одном кристалле
Mikl___ вне форума Ответить с цитированием
Старый 20.09.2012, 16:11   #8
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Да, начиная с 486 CPU и FPU находятся на одном кристалле
Но ведь по прежнему это отдельное устройство, только в одном кристале

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 20.09.2012, 16:50   #9
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

ну, да. работают параллельно.
f.hump вне форума Ответить с цитированием
Старый 20.09.2012, 18:46   #10
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Еще небольшой вопрос. Не найду инструкцию, которая, осуществляет сравнение и выталкивает сразу два операнда? FCOMIP выталкивает только один, fcompp использовать не удобно. Или проще после FCOMIP сделать FINCSTP? Что будет быстрее работать?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 20.09.2012 в 18:52.
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файл вещественных чисел Lifehouse Общие вопросы C/C++ 3 05.06.2012 15:08
Дана последовательность вещественных чисел. каждая пара чисел задает границы отрезка. Найти количество целых чисел на отрезках 'studentka' Помощь студентам 6 30.11.2011 18:35
Дано n вещественных чисел а1, а2,…,аn. Определите число соседств двух чисел разного знака (Паскаль) bambam Помощь студентам 1 29.11.2011 11:36
Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных максимумов в порядке возрастания zzz6 Помощь студентам 1 04.07.2011 12:59
Списки вещественных чисел. в С++ KRT Помощь студентам 2 23.07.2009 13:06