реклама на сайте
подробности

 
 
> Вещественные числа, перемножение
deast
сообщение Apr 18 2007, 09:54
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 8-06-05
Пользователь №: 5 827



Заранее извиняюсь, если не в той ветке тему открыл.

Встала задача реализации на ПЛИС умножителя двух 32-разрядных чисел с плавающей точкой. В общих чертах алгоритм ясен. Проблемы начались, когда я попытался перемножить нормальное число и денормализованное. После сложения экспонент(Е) получился какой-то положительный результат (например 5). А в результате перемножения мантисс(М), результат меньше единицы.(например 0,000011…) . По идее необходимо это значение М сдвигать влево и при каждом сдвиге на бит, уменьшать Е на единицу. Делать это необходимо до тех пор, пока М не станет >=1, либо Е не станет нулем. На некотором этапе у меня получились значения: М=0,1…., Е=1. В данной ситуации я с одной стороны должен еще М сдвинуть на один разряд, поскольку Е позволяет. С другой стороны если Е принимает нулевое значение, то число денормализованное и М<1. Подскажите, если кто владеет, что с этим делать или поделитесь ссылками, где почитать. Спасибо…
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sergey'F
сообщение Apr 20 2007, 16:44
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



Вы хотите по IEEE-754? Ссылки на сам стандарт под рукой нет, почитайте лекцию http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF а разделе Underflow.

Числа хранятся в виде, приведенном к форме 1.mmmm•2eee, 1 в записи не хранится, однако, если поле показателя становится равным 0, лидирующая 1 исчезает (то есть, Вы должны принимать скрытый целый разряд как 0, если показатель равен нулю) и при этом 2 возводится в степень, которой соответствует значение поля показателя 1 (для 32-х битного представления это 126).

m=0.0011... e=00000010 //val=0.0011...*2^(127-2)
m=0.011... e=00000001 //val=0.011...*2^(127-1)
дальше уменьшать показатель нельзя, а в старшем бите мантиссы 0, тогда в результате будет
m=011... e=00000000 //val=0.011...*2^-126

Если бы было
m=0.110... e=00000010 //val=0.110...*2^(127-2)
m=1.10... e=00000001 //val=1.10...*2^(127-1)
число нормализовано - в старшем бите мантиссы 1, тогда в результате будет
m=10... e=00000001 //val=1.10...*2^(127-1)

Если это число решим поделить на два, то получим, что поле показателя должно стать равным 0, тогда лидирующая единица (скрытая) перейдет в мантиссу, а поле показателя станет равным нулю:
m=110... e=00000000 //val=0.11...*2^-126
еще раз делим на два
m=0110... e=00000000 //val=0.011...*2^-126
ну и так пока все не единичные биты из мантиссы не выдвинутся из числа, дальше - 0

Сообщение отредактировал Sergey'F - Apr 20 2007, 16:47
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 22:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01354 секунд с 7
ELECTRONIX ©2004-2016