Изменения

Перейти к: навигация, поиск

Представление вещественных чисел

1284 байта добавлено, 22:09, 28 февраля 2012
Исправлена ошибка в таблице для Single precision, добавлен подробный пример для сложения
!style="background-color: powderblue; border: thin solid black; border-top: none"|
!colspan=8 style="background-color: lightgreen; border: thin solid black"|Порядок (8 бит)
!colspan=24 style="background-color: lightcoral; border: thin solid black"|Мантисса (2423+1 бита)
|-style="text-align: right"
!style="background-color: powderblue; border: thin solid black"|0
|style="border: none"|
|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|30
|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|2423
|style="border: none"|
|colspan=20 style="border: none; border-left: 1px solid gray; text-align: left"|2322
|colspan=3 style="border: none; border-right: 1px solid gray; text-align: right"|0
|}
== Действия с числами с плавающей запятой ==
=== Умножение и деление ===
Самыми простыми для восприятия арифметическими операциями над числами с плавающей запятой являются умножение и деление. Для того, чтобы умножить два вещественных числа в нормализованной форме мы умножаем необходимо перемножить их мантиссы друг на друга, а сложить порядки складываем. Затем округляем мантиссу, чтобы она поместилась в данное округлить и нормализовать полученное число бит и приводим результат к нормализованному виду. Вот простой пример<!-- Пример:
e=3; m=4.734612 (порядок и мантисса первого числа)
e=8; m=25.64854 (мантисса после округления)
e=9; m=2.564854 (нормализованная форма)
-->
Соответственно, чтобы произвести деление нужно разделить мантиссу делимого на мантиссу делителя и вычесть из порядка делимого порядок делителя. Затем точно так же округлить мантиссу результата и привести его к нормализованной форме.
<!-- Всё это круто, но было бы еще круче написать, как оно на реальном железе умножается и делится. В двоичной системе, с учетом округления и всеми делами. Но это, пожалуй, будет уж слишком мощно для формата "вики-конспекта". лучше куда-нибудь сюда добавить внешнюю ссылку -->
=== Сложение и вычитание ===
Идея метода сложения и вычитания чисел с плавающей точкой заключается в приведении их к одному порядку. Сначала выбирается оптимальный порядок, затем мантиссы обоих чисел представляются в соответствии с новым порядком, затем над ними производится сложение/вычитание, мантисса результата округляется и, если нужно, результат приводится к нормализированной форме. Пример:
 
Выполним сложение чисел с плавающей точкой и смещенным порядком в 32-х разрядном формате -269 7/32 и 405,875.
Переведем -269 7/32 в машинный вид. Для этого сначала переведем его в двоичную систему счисления.
-269 7/32 = -269,21875
-269,21875<sub>10</sub> = -100001101,00111<sub>2</sub>
 
Нормализуем полученное двоичное число по правилам машинной арифметики.
-100001101,00111 = -1,0000110100111 &times; 10<sup>1000</sup>
 
Найдем смещенный порядок. Так как в условии говориться о 32-разрадном представлении, то смещение порядка равно 127<sub>10</sub>.
E = 8<sub>10</sub> + 127<sub>10</sub> = 1000<sub>2</sub> + 1111111<sub>2</sub> = 10000111<sub>2</sub>
 
Число отрицательное, следовательно, в бите знака будет стоять единица.
 
Итак, первое число в машинном 32-разрадном представлении с плавающей точкой будет иметь вид:
1<strong>10000111</strong>00001101001110000000000 (жирным шрифтом выделен порядок числа, длина мантиссы - 23 бита).
 
Переведем второе число в машинный вид, совершая те же действия.
 
405,87510 = 110010101,111<sub>2</sub> = 1,10010101111 &times; 10<sup>1000</sup>
Очевидно, что порядок со смещением у второго числа будет таким же, как и у первого.
 
Второе число положительное, следовательно, бит знака будет содержать ноль.
 
Итак в машинном 32-разрядном представлении второе число будет иметь вид:
=== Сложение 0<strong>10000111</strong>10010101111000000000000  Порядки у слагаемых равны, поэтому пропускаем шаг выравнивания порядков и проводим вычитание ===мантисс по правилам двоичной арифметики. В Идея метода сложения и вычитания чисел с плавающей точкой заключается в приведении их к одному порядку. Сначала выбирается оптимальный порядок компьютере этим занимается арифметический сопроцессор, затем мантиссы обоих чисел представляются встроенный в соответствии с новым порядком, затем над ними производится сложение/вычитание, мантисса результата округляется и, если нужно, результат приводится к нормализированной формецентральный процессор машины. Пример для десятичных чисел в экспоненциальной нормализированной форме:
1,1001010111100<texsub>123456.7 = 2</sub> - 1.234567 \times 10^5,0000110100111</texsub>2<br/sub> = 0,1000100010101<texsub>101.7654 = 1.017654 \times 10^2 = 0.001017654 \times 10^5</texsub>
Отсюда: <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 \times 10^5 </tex>
По шагам: 0<strong>10000110</strong>00010001010100000000000
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вычтя из него значение смещения 127<sub>10</sub>.235585 (Это наш результат)
В этом примере видно, что последние три цифры результата были утеряны после округления. Это называется ошибкой округления, и в предельном случае она может вызвать ситуацию, когда сумма двух конечных ненулевых чисел равна одному из них: E = 10000110<sub>2</sub> - 1111111<sub>2</sub> = 134<sub>10</sub> - 127<sub>10</sub> = 7<sub>10</sub> = 111<sub>2</sub>
e=5; m=1.234567Следовательно, число результата будет иметь вид: + e=−3; m=9.876543 e=5; mA =1.234567 + e=5,000100010101 &times; m=0.00000009876543 (после сдвига) ---------------------- e=5; m10<sup>111</sup> =1.23456709876543 (настоящая сумма) e10001000,10101<sub>2</sub> =5; m=1.234567 (после округления и нормализации - равна первому числу)136,65625<sub>10</sub>
Аналогичная ситуация возможна при вычитании чисел Результат наших вычислений верен, поэтому к арифметическим операциям и сравнениям чисел с плавающей запятой нужно относиться очень осторожно. Проблема частично решаема с помощью [[#Денормализованные числа|денормализованных чисел]]так как 405, но у них есть свои недостатки875 - 269,21875 = 136,65625.
=== Алгоритм получения представления вещественного числа в памяти ЭВМ ===
101
правка

Навигация