- •6. Арифметические операции над числами с плавающей точкой
- •6.1 Операции пересылки или копирования
- •6.1.1 Преобразования формата с плавающей точкой
- •6.1.2 Округление числа с плавающей точкой до целочисленного значения
- •6.1.3 Преобразования между форматами с плавающей точкой и целочисленным форматом
- •6.2 Операции сравнения
6.1 Операции пересылки или копирования
Эти одноместные операции применяются при пересылке или копировании значений переменных или чисел. Если форматы и/или способы представления информации в источнике и приемнике не совпадают, то возникает задача преобразования данного взятого в формате источника для записи его в формат приемника.
6.1.1 Преобразования формата с плавающей точкой
Рассмотрим преобразования при пересылке данных между базовыми форматами одинарной и двойной точности. При ином сочетании форматов необходимо дополнительно учитывать выбранные в расширенных форматах bias, которые стандарт не регламентирует, и допустимость ненормализованного представления мантисс.
При равенстве форматов задача пересылки сводится к простому копированию содержимого исходного формата в формат результата.
При расширении формата исключительные ситуации, кроме ситуации невыполнимая операция, не возникают. Коды в полях порядка и мантиссы изменяют так, чтобы содержание информации сохранилось.
Если исходный формат содержит простое NaN, то в поле порядка результата записывают единицы, а в поле мантиссы – код простого NaN эквивалентный по назначению исходному коду.
Если исходный код содержит 0 или (рис.5-7), то преобразования сводятся к расширению количества 1 или 0 в полях порядка и мантиссы.
Если исходный формат содержит нормализованное число (рис.5-7), то нужно учесть различие bias в форматах. Для этого смещенный порядок исходного формата следует увеличить на величину разности bias форматов . Содержимое поля дробной части мантиссы необходимо расширить вправо нулями.
Если исходный формат содержит ненормализованное число, то в формате результата оно должно быть представлено как число нормализованное. Для этого в поле смещенного порядка результата следует записать код равный разности bias форматов уменьшенной на количество нулей в старших битах поля дробной части мантиссы исходного формата, а в поле дробной части мантиссы результата – дробную часть нормализованной мантиссы операнда расширенную справа нулями.
Например, если ненормализованное число пересылается из одинарного базового формата в двойной базовый, то его порядок (–126). Если дробная часть мантиссы содержит слева 001…, то при нормализации числа его мантиссу придется сдвинуть на три разряда влево и уменьшить порядок до (–129). Код смещенного порядка в формате результата будет . Этот же результат получим, если из разности bias форматов вычтем количество нулей в дробной части мантиссы. Действительно .
Замечание. Если при записи результата выполнения операции в формат с малой точностью возникли исключительные ситуации потери точности, переполнения или потери значимости, а затем выполняется операция пересылки в формат большей точности, то все внесенные в результат погрешности сохраняются, и число в формате с большей точностью будет иметь точность меньшую, чем точность формата. При этом число, ставшее при записи в формат малой точности равным или нулю, после пересылки сохранит значение или 0. Если бы тот же результат был сразу записан в формат большой точности, то он мог бы быть представлен нормализованным числом и, быть может, с точным значением.
Например, результат умножения в формате с одинарной точностью двух максимальных по модулю чисел будет с разрядностью мантиссы 48. При отсутствии обработки исключительной ситуации переполнения результат в формате одинарной точности . При его копировании в формат двойной точности получим . Если тот же результат сразу записать в формат двойной точности, то, так как разрядность мантиссы формата 54 и границы диапазона , произведение будет записано точно.
Поэтому в программах следует избегать операции пересылки в расширенный формат, записывая результат сразу в широкий формат.
При сужении формата преобразования существенно осложняются из-за меньшей точности и многократно меньшего диапазона порядка чисел в формате результата. Лишь немногие числа из двойного формата можно записать в одинарный даже с потерей точности. Поэтому при сужении формата могут возникнуть исключительные ситуации переполнения, потери значимости, потеря точности и невыполнимая операция.
Если исходный формат содержит простое NaN, то возникает исключительная ситуация невыполнимая операция. При отсутствии обработки по прерыванию в результат записывают простое NaN предусмотренное на этот случай.
Если исходный формат содержит 0 или , то в формат результата записывают их коды.
Если исходный формат содержит ненормализованное число, то складываются исключительные ситуации потери значимости и потери точности.
Если исходный формат содержит нормализованное число, то возможны исключительные ситуации переполнения, потери значимости и потери точности. Не исключено, что в одинарном формате число будет ненормализованным. При записи нормализованного числа в формат результата следует руководствоваться правилами, изложенными в разделе 5.4.
Если число при записи в двойной формат было округлено с потерей точности, то при пересылке в одинарный формат будет выполняться второе округление возможно с потерей точности, что крайне не желательно. Возможность такой ситуации следует учитывать при программировании.