![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Участник клуба
Регистрация: 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 и т.п? Если да, то какие? Что-то очень сильно я запутался. Заранее благодарю. |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
_PROGRAMM_
И что там было непонятно? Я еще упоминал FTST и FXAM, если не хочешь париться с командой SAHF и переводить флаги сопроцессора в соответствующие биты EFLAGS используй команды FCOMI, FCOMIP, FUCOMI, FUCOMIP, после них можно использовать команды условного перехода типа jl, je и т.д., а чтобы понять отрицательное вещественное число или положительное достаточно получить значение ее старшего бита, если =1, то отрицательное, проверку на ноль тоже можно упростить, так как вещественный 0.0 и целочисленный 0 это одно и тоже! |
![]() |
![]() |
![]() |
#3 | |
Участник клуба
Регистрация: 30.07.2009
Сообщений: 1,601
|
![]()
Т.е. для того, чтобы сравнить числа, мне придется придумывать логику их сравнения? Что-то я не пойму. Если мне, например, нужно сравнить 0.5 с заведомо неизвестным(x) и узнать: это неизвестное больше 0,5 или меньше. Нужно будет сначала сравнить знак, если x отрицательное, то оно меньше, если x=0(получается еще одно сравнение и флаги сбросятся) и только после этого сравнивать инструкциями ja je? Вы упомянули о jl следовательно сравнение со знаком можно выполнять ею?
Или есть какой-то другой, более рациональный, способ? Вообще какие инструкции сравнения использовать можно, а какие - нет? Цитата:
Последний раз редактировалось _PROGRAMM_; 19.09.2012 в 07:23. |
|
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
_PROGRAMM_, нет не то
если я хочу узнать, что вещественное число Y меньше нуля, то не прибегая к FCOM я могу написать Код:
Код:
|
![]() |
![]() |
![]() |
#5 | |
C/C++, Asm
Участник клуба
Регистрация: 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 Цитата:
Последний раз редактировалось f.hump; 19.09.2012 в 15:18. |
|
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 30.07.2009
Сообщений: 1,601
|
![]()
Спасибо за помощь. Для заключения скажу, что очень много знаний дала мне книга, прочитать которую предложил Mikl___(не разрешают + поставить), Юрий Магда - "Ассемблер для процессоров Intel Pentium". Тем кто попадет сюда через поиск, советую почитать. Хотя бы о сопроцессоре.
Последний раз редактировалось _PROGRAMM_; 19.09.2012 в 20:40. |
![]() |
![]() |
![]() |
#7 | |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#9 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
ну, да. работают параллельно.
|
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 30.07.2009
Сообщений: 1,601
|
![]()
Еще небольшой вопрос. Не найду инструкцию, которая, осуществляет сравнение и выталкивает сразу два операнда? FCOMIP выталкивает только один, fcompp использовать не удобно. Или проще после FCOMIP сделать FINCSTP? Что будет быстрее работать?
Последний раз редактировалось _PROGRAMM_; 20.09.2012 в 18:52. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Файл вещественных чисел | 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 |