deast 0 18 апреля, 2007 Опубликовано 18 апреля, 2007 · Жалоба Заранее извиняюсь, если не в той ветке тему открыл. Встала задача реализации на ПЛИС умножителя двух 32-разрядных чисел с плавающей точкой. В общих чертах алгоритм ясен. Проблемы начались, когда я попытался перемножить нормальное число и денормализованное. После сложения экспонент(Е) получился какой-то положительный результат (например 5). А в результате перемножения мантисс(М), результат меньше единицы.(например 0,000011…) . По идее необходимо это значение М сдвигать влево и при каждом сдвиге на бит, уменьшать Е на единицу. Делать это необходимо до тех пор, пока М не станет >=1, либо Е не станет нулем. На некотором этапе у меня получились значения: М=0,1…., Е=1. В данной ситуации я с одной стороны должен еще М сдвинуть на один разряд, поскольку Е позволяет. С другой стороны если Е принимает нулевое значение, то число денормализованное и М<1. Подскажите, если кто владеет, что с этим делать или поделитесь ссылками, где почитать. Спасибо… Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 18 апреля, 2007 Опубликовано 18 апреля, 2007 · Жалоба http://www.opencores.org/projects.cgi/web/fpu100/overview Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DukeXar 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Если порядок (E) смещенный, т.е. принимает только положительные значения, то его нулевое значение - минимальное значение, поэтому вполне возможно для использования. Т.е. порядок никак не влияет на то, является ли число нормализованным или денормализованным. Вот если он равен 0, а мантисса все еще не нормализованна, т.е. ее необходимо сдвинуть еще один раз влево (или несколько раз), то порядок уже некуда уменьшать, в результате получится переполнение (не помню как оно правильно называется, underflow), и результат получится равным 0. Вы просто не можете представить такое число в используемой разрядной сетке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
deast 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Да, значение Е не может быть отрицательным. Но если Е=0, то число денормализованное, т.е М<1. Не совсем понятна ситуация. Берем два примера (значения в бинарном виде): Е=110 М=0,0001… Результирующие значения Е=010 М=1,…(нормальное число) Другая комбинация: Е=010 М=0,0001… Результирующие значения Е=000 М=0,01…(денормализованное число) А если вот такая комбинация Е=100 М=0,0001… Каковы результирующие значения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DukeXar 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Да, значение Е не может быть отрицательным. Но если Е=0, то число денормализованное, т.е М<1. Не совсем понятна ситуация. Берем два примера (значения в бинарном виде): Е=110 М=0,0001… Результирующие значения Е=010 М=1,…(нормальное число) Другая комбинация: Е=010 М=0,0001… Результирующие значения Е=000 М=0,01…(денормализованное число) А если вот такая комбинация Е=100 М=0,0001… Каковы результирующие значения? Е=010 М=0,0001… Сдвигаем: 001 0,001xx Все, дальше некуда -> генерируем исключение 100 0,0001xx 011 0,001xx0 010 0,01xx00 001 0,1xx000 Дальше опять некуда -> исключение Такие числа, как в последнем примере входят в область, которые нельзя представить нормализованными числами в данной сетке. Погрешность. http://en.wikipedia.org/wiki/IEEE_754 и IA-32 Intel Architecture Software Developer's Manual. Volume 1: Basic Architecture. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 20 апреля, 2007 Опубликовано 20 апреля, 2007 (изменено) · Жалоба Вы хотите по 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 Изменено 20 апреля, 2007 пользователем Sergey'F Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
deast 0 25 апреля, 2007 Опубликовано 25 апреля, 2007 · Жалоба Все, понял. Может кому пригодится. Оказывается истинное значение экспоненты равно единице, когда Е=0. Поэтому М сдвигаем влево пока оно не выполнится одно из условий: М>=1 или Е=1. Далее проверяем. Если М>=1, то в поле экспоненты записываем текущее значение Е, а если нет, то записываем ноль. В поле мантиссы записывается текущее значение М после запятой... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться