101
правка
Изменения
Добавил информацию о сложении и вычитании
== Действия с числами с плавающей запятой ==
=== Умножение и деление ===
Самыми простыми для восприятия арифметическими операциями над числами с плавающей запятой являются умножение и деление. Для того, чтобы умножить два вещественных числа в нормализованной форме мы умножаем их мантиссы друг на друга, а порядки складываем. Затем округляем мантиссу, чтобы она поместилась в данное число бит и приводим результат к нормализованному виду. Вот простой пример:
e=3; m=4.734612 (порядок и мантисса первого числа)
× e=5; m=5.417242 (порядок и мантисса второго числа)
-----------------------
e=8; m=25.648538980104 (произведение как оно есть)
e=8; m=25.64854 (мантисса после округления)
e=9; m=2.564854 (нормализованная форма)
Соответственно, чтобы произвести деление нужно разделить мантиссу делимого на мантиссу делителя и вычесть из порядка делимого порядок делителя. Затем точно так же округлить мантиссу результата и привести его к нормализованной форме.
<!-- Всё это круто, но было бы еще круче написать, как оно на реальном железе умножается и делится. В двоичной системе, с учетом округления и всеми делами. Но это, пожалуй, будет уж слишком мощно для формата "вики-конспекта". лучше куда-нибудь сюда добавить внешнюю ссылку -->
=== Сложение и вычитание ===
Идея метода сложения и вычитания чисел с плавающей точкой заключается в приведении их к одному порядку. Сначала выбирается оптимальный порядок, затем мантиссы обоих чисел представляются в соответствии с новым порядком, затем над ними производится сложение/вычитание, мантисса результата округляется и, если нужно, результат приводится к нормализированной форме. Пример для десятичных чисел в экспоненциальной нормализированной форме:
<tex>123456.7 = 1.234567 \times 10^5</tex><br/>
<tex>101.7654 = 1.017654 \times 10^2 = 0.001017654 \times 10^5</tex>
Отсюда:
<tex>
123456.7 + 101.7654 = (1.234567 \times 10^5) + (1.017654 \times 10^2)
= (1.234567 \times 10^5) + (0.001017654 \times 10^5)
= (1.234567 + 0.001017654) \times 10^5
= 1.235584654 × 10^5
</tex>
По шагам:
e=5; m=1.234567 (123456.7)
+ e=2; m=1.017654 (101.7654)
e=5; m=1.234567
+ e=5; m=0.001017654 (Мантисса второго числа после сдвига)
--------------------
e=5; m=1.235584654
Это настоящий результат. Его придется округлить до семи знаков после запятой и нормализировать, если понадобится.
e=5; m=1.235585 (Это наш результат)
В этом примере видно, что последние три цифры результата были утеряны после округления. Это называется ошибкой округления, и в предельном случае она может вызвать ситуацию, когда сумма двух конечных ненулевых чисел равна одному из них:
e=5; m=1.234567
+ e=−3; m=9.876543
e=5; m=1.234567
+ e=5; m=0.00000009876543 (после сдвига)
----------------------
e=5; m=1.23456709876543 (настоящая сумма)
e=5; m=1.234567 (после округления и нормализации - равна первому числу)
Аналогичная ситуация возможна при вычитании чисел, поэтому к арифметическим операциям и сравнениям чисел с плавающей запятой нужно относиться очень осторожно. Проблема частично решаема с помощью [[#Денормализованные числа|денормализованных чисел]], но у них есть свои недостатки.
=== Алгоритм получения представления вещественного числа в памяти ЭВМ ===
== Ссылки ==
=== Использованные материалы ===
* [http://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C http://ru.wikipedia.org/wiki/Экспоненциальная_запись]
* [http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D0%B7%D0%B0%D0%BF%D1%8F%D1%82%D0%BE%D0%B9 http://ru.wikipedia.org/wiki/Число_с_плавающей_запятой]
* [http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%80%D0%B8%D1%86%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B8_%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BB%D1%8C http://ru.wikipedia.org/wiki/Отрицательный и положительный ноль]
*[http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BF%D0%BE%D0%BB%D0%BE%D0%B2%D0%B8%D0%BD%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8 http://ru.wikipedia.org/wiki/Число_половинной_точности]
*[http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8 http://ru.wikipedia.org/wiki/Число_одинарной_точности]
*[http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D1%87%D0%B5%D1%82%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8 http://ru.wikipedia.org/wiki/Число_четверной_точности]
*[http://comp-science.narod.ru/Cod/cod.html http://comp-science.narod.ru/Cod/cod.html]
*[http://en.wikipedia.org/wiki/NaN http://en.wikipedia.org/wiki/NaN ''(англ.)'']
*[http://en.wikipedia.org/wiki/Floating_point http://en.wikipedia.org/wiki/Floating_point ''(англ.)'']
=== Что стоит прочесть ===
* [http://grouper.ieee.org/groups/754 Материалы по стандарту IEEE 754 ''(англ.)'']
* [http://softelectro.ru/ieee754.html Русский перевод стандарта IEEE 754]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Представление информации]]