Числа с плавающей точкой


Содержание

IEEE 754 — стандарт двоичной арифметики
с плавающей точкой

Автор: Яшкардин Владимир &nbsp &nbsp
www.softelectro.ru &nbsp &nbsp
Дата: 2009 &nbsp &nbsp &nbsp &nbsp
Редакция: 04.06.2012
info@softelectro.ru

§1. Название стандарта.

Данный стандарт разработан ассоциацией IEEE (Institute of Electrical and Electronics Engineers) и используется для представления действительных чисел (чисел с плавающей точкой) в двоичном коде. Наиболее используемый стандарт для вычислений с плавающей точкой, используется многими микропроцессорами и логическими устройствами, а также программными средствами.


    Полное название стандарта в ассоциации IEEE:
  • IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985)
  • IEEE стандарт для двоичной арифметики с плавающей точкой (ANSI/IEEE Std 754-1985)


    Название стандарта в международной электротехнической комиссии IEC:
  • IEC 60559:1989, Binary floating-point arithmetic for microprocessor systems
  • IEC 60559:1989 двоичная арифметика с плавающей точкой для микропроцессорных систем
  • (IEC 559:1989 — старое обозначение стандарта)

В 2008 года ассоциация IEEE выпустила стандарт IEEE 754-2008, который включил в себя стандарт IEEE 754-1985.

§2.Краткое описание стандарта.

Стандарт содержит 23 страницы текста в 7 секциях и одном приложении: 1.Scope(Область применения) 1.1 Implementation Objectives (Описывает цели стандарта) 1.2 Inclusions (Описывает что включено в стандарт) 1.3 Exclusions (Описывает что не определяет стандарт) 2.Definitions (Вводимы определения) 3.Formats (Форматы чисел) 3.1 Sets of Values (Наборы переменных для представления формата) 3.2 Basic Formats (Базовые форматы) 3.3 Extended Formats (Расширенные форматы) 3.4 Combinations of Formats (Комбинирование форматов) 4.Rounding (Округления) 4.1 Round to Nearest (Округление к ближайшему) 4.2 Directed Roundings (Прямое округление) 4.3 Rounding Precision (Точность округления) 5.Operations (Операции) 5.1 Arithmetic (Арифметика) 5.2 Square Root (Квадратный корень) 5.3 Floating-Point Format Conversions (Конверсия форматов с плавающей точкой) 5.4 Conversion Between Floating-Point and Integer Formats (Конверсия между форматами с плавающими точками и форматами целых чисел.) 5.5 Round Floating-Point Number to Integer Value (округление чисел с плавающей точкой в целые числа) 5.6 Binary Decimal Conversion (Конверсия бинарного в десятичное) 5.7 Comparison (Сравнение) 6.Infinity, NaNs, and Signed Zero (Бесконечность, не числа, и знаковый ноль) 6.1 Infinity Arithmetic (Арифметические действия с бесконечностями) 6.2 Operations with NaNs (Операции с не числами) 6.3 The Sign Bit (Операции с знаковым бит) 7.Exceptions (Исключения) 7.1 Invalid Operation (Недопустимые операции) 7.2 Division by Zero (Деление на ноль) 7.3 Overflow (Переполнение) 7.4 Underflow (Нехватка разряда) 7.5 Inexact (Неточность) 8.Traps (Обнаружение недопустимых операций) 8.1 Trap Handler (Исполнитель обнаружения недопустимых операций) 8.2 Precedence (Первоочередность) A.Recommended Functions and Predicates (Рекомендованные функции и утверждения)

&nbsp &nbsp &nbsp &nbspК сожалению, организация IEEE превратилась из международной общественной инженерной организации (которой она была изначально) в торговую организацию.
Этой организации принадлежит авторское право на публикацию стандарта IEEE754-1985.
Поэтому если вы захотите ознакомиться, с оригиналом стандарта, вам придется купить его примерно за 80$.
Но, Российского законодательство разрешает мне в учебных целях комментировать данный стандарт.
Поэтому дальше я буду давать вольное изложение стандарта и выражать своё мнение о нём в учебных целях.


    Стандарт IEEE 754-1985 определяет:
  • как представлять нормализованные положительные и отрицательные числа с плавающей точкой
  • как представлять денормализованные положительные и отрицательные числа с плавающей точкой
  • как представлять нулевые числа
  • как представлять специальную величину бесконечность (Infinity)
  • как представлять специальную величину «Не число» (NaN или NaNs)
  • четыре режима округления


    IEEE 754-1985 определяет четыре формата представления чисел с плавающей запятой:
  • с одинарной точностью (single-precision) 32 бита
  • с двойной точностью (double-precision) 64 бита
  • с одинарной расширенной точностью (single-extended precision) >=43 бит (редко используемый)
  • с двойной расширенной точностью (double-extended precision) >= 79 бит (обычно используют 80 бит)


§3. Основные понятия в представлении чисел с плавающей точкой.


3.1 Представление числа в нормализованном экспоненциальном виде.

Возьмем, к примеру, десятичное число 155,625
Представим это число в нормализованном экспоненциальном виде : 1,55625∙10 +2 =1,55625∙exp10 +2
Число 1,55625∙exp10 +2 состоит из двух частей: мантиссы M=1.55625 и экспоненты exp10=+2
Если мантисса находится в диапазоне 1 -2 .

3.2 Представление числа в денормализованном экспоненциальном виде.

Возьмем, к примеру, десятичное число 155,625
Представим это число в денормализованном экспоненциальном виде : 0,155625∙10 +3 =0,155625∙exp10 +3
Число 0,155625∙exp10 +3 состоит из двух частей: мантиссы M=0,155625 и экспоненты exp10=+3
Если мантисса находится в диапазоне 0,1 -3 .

3.3 Преобразование десятичного числа в двоичное число с плавающей точкой.

Наша задача сводится к представлению десятичного числа с плавающей точкой, в двоичное число с плавающей точкой в экспоненциальном нормализованном виде. Для этого разложим заданное число по двоичным разрядам:

155,625 = 1∙2 7 +0∙2 6 +0∙2 5 +1∙2 4 +1∙2 3 +0∙2 2 +1∙2 1 +1∙2 0 +1∙2 -1 +0∙2 -2 +1∙2 -3
155,625 =128 + 0 + 0 + 16 + 8 + 0 + 2 + 1 + 0,5 + 0 + 0,125
155,62510 = 10011011,1012 — число в десятичной и в двоичной системе с плавающей точкой

Приведем полученное число к нормализованному виду в десятичной и двоичной системе:
1,55625∙exp10 +2 = 1,0011011101∙exp2 +111

В результате мы получили основные составляющие экспоненциального нормализованного двоичного числа:
Мантиссу M=1,0011011101
Экспоненту exp 2= +111

§4. Описание преобразования чисел по стандарту IEEE 754.

4.1 Преобразование двоичного нормализованного числа в 32 битный формат IEEE 754

Основное применение в технике и программирование получили форматы 32 и 64 бита.
Например, в VB используют типы данных single (32 бита) и double (64 бита).
В Си аналогично используют float (32 бита) и double (64 бит)
Рассмотрим преобразование двоичного числа 10011011,101 в формат single-precision (32 бита) стандарта IEEE 754.
Остальные форматы представления чисел в IEEE 754 являются увеличенной копией single-precision.


Чтобы представить число в формате single-precision IEEE 754 необходимо привести его к двоичному нормализованному виду. В §3 мы проделали это преобразование над числом 155,625. Теперь рассмотрим, как двоичное нормализованное число преобразуется к 32 битному формату IEEE 754.


    Описание преобразования в 32 битный формат IEEE 754:
  • Число может быть + или — .
    Поэтому отводится 1 бит для обозначения знака числа:
    0-положительное
    1-отрицательное
    Этот самый старший бит в 32 битной последовательности .
  • Далее пойдут биты экспоненты, для этого выделяют 1 байт (8 бит).
    Экспонента может быть, как и число, со знаком + или -.
    Для определения знака экспоненты, чтобы не вводить ещё один бит знака, добавляют смещение к экспоненте в половину байта +127(0111 1111). То есть, если наша экспоната = +7 (+111 в двоичной), то смещенная экспонента = 7+127=134. А если бы, наша экспонента была -7 , то смещенная экспонета=127-7 =120. Смещенную экспоненту записывают в отведенные 8 бит. При этом, когда нам будет нужно получить экспоненту двоичного числа, мы просто отнимем 127 от этого байта.
  • Оставшиеся 23 бита отводят для мантиссы.
    Но, у нормализованной двоичной мантиссы первый бит всегда равен 1, так как число лежит в диапазоне 1 В таблице представлено десятичное число 155,625 в 32-х битном формате IEEE754: 1 бит 8 бит 23 бит IEEE 754 0 1000 0110 001 1011 1010 0000 0000 0000 431BA000 (hex) 0(dec) 134(dec) 1810432(dec) знак числа смещенная экспонента остаток от мантиссы число 155,625 в формате IEEE754

В результате десятичное число 155,625 представленное в IEEE 754 c одинарной точностью равно 431BA000 (hex).

4.2 Преобразования числа формата 32 бит IEEE 754 в десятичное число


    Чтобы записать число в стандарте IEEE 754 или восстановить его, необходимо знать три параметра:
  • S- бит знака (31-й бит)
  • E- смещенная экспонента (30-23 биты)
  • M — остаток от мантиссы (22-0 биты)

Это целые числа которые записанные в числе IEEE 754 в двоичном виде.

Приведём формулу для получения десятичного числа из числа IEEE754 одинарной точности:

где F — десятичное число

Проверяем наш пример:
F =(-1) 0 ∙2 (134-127) ∙(1+ 1810432 / 2 23 )= 2 7 ∙(1+0,2158203125)=128∙1,2158203125=155,625

Вывод этой формулы приводить не буду, всё видно и так. Поясню только (1+ M/2 23 ) — это мантисса, единица в этой формуле- это та единица, которую мы выбросили из 23 бит, а остаток мантиссы в десятичном виде находим отношением двух целых чисел — остатка мантиссы к целому.

§5. Формальное представление чисел в стандарте IEEE 754 для любого формата точности.

Рис. 1 Представление числа в формате IEEE 754


    где:
  • S — бит знака, если S=0 — положительное число; S=1 — отрицательное число
  • E — смещенная экспонента двоичного числа;
    exp2 = E — (2 (b-1) — 1) — экспонента двоичного нормализованного числа с плавающей точкой
    (2 (b-1) -1) — заданное смещение экспоненты (в 32-битном ieee754 оно равно +127 см.выше)
  • M — остаток мантиссы двоичного нормализованного числа с плавающей точкой


Формула вычисления десятичных чисел с плавающей точкой, из чисел представленных в стандарте IEEE754:

Используя формулу №1 вычислим формулы для нахождения десятичных чисел из форматов одинарной (32 бита) и двойной (64 бита) точности IEEE 754:

Рис.2 Формат числа одинарной точности (single-precision) 32 бита

Рис.3 Формат числа двойной точности (double-precision) 64 бита

§6. Представление денормализованного числа и других чисел в формате IEEE 754



    Если применить формулу №1 для вычисления минимального и максимального числа одинарной точности представленного в IEEE754, то получим следующие результаты:
  • 00 00 00 00 hex= 5,87747175411144e-39 (минимальное положительное число)
  • 80 00 00 00 hex=-5,87747175411144e-39 (минимальное отрицательное число)
  • 7f ff ff ff hex= 6,80564693277058e+38 (максимальное положительное число)
  • ff ff ff ff hex=-6,80564693277058e+38 (максимальное отрицательное число)

Отсюда видно, что невозможно представить число нуль или бесконечность в заданном формате.

Поэтому формула №1 не применяется в следующих случаях:


1. число IEEE754=00 00 00 00hex считается числом +0

число IEEE754=80 00 00 00hex считается числом -0

2. число IEEE754=7F 80 00 00hex считается числом +&#8734

число IEEE754=FF 80 00 00hex считается числом -&#8734

3. числа IEEE754=FF (1xxx)X XX XXhex не считается числами (NAN), кроме случая п.2
&nbsp &nbsp числа IEEE754=7F (1xxx)X XX XXhex не считается числами (NAN), кроме случая п.2
Число представленное в битах с 0. 22 могут быть любым числом кроме 0 (т.е.+&#8734 и -&#8734 ).

4. числа IEEE754=(x000) (0000) (0xxx)X XX XXhex считаются денормализованными числами, за исключением чисел п.1(то есть -0 и +0)

Формула расчета денормализованных чисел:


    Пояснения к исключительным числам:
  • С нулем понятно. Без него никак нельзя. Смущает только наличие двух нулей. Думаю, это было сделано для симметричности.
  • — &#8734/ +&#8734 , тоже понятно. Числа, которые больше границ диапазона представления чисел считаются бесконечными.
  • Не числа NAN(No a Numbers). К ним относятся символы, или результаты недопустимых операций.
  • Денормализованные числа. Это числа, мантиссы которых лежат в диапазоне 0.1 -126 ∙(1+0/2 23 )= 2 -126 ≈ 1,17549435∙e -38
    80 80 00 00 = -2 -126 ∙(1+0/2 23 )=-2 -126 ≈ -1,17549435∙e -38

Максимальное денормализованое число (абсолютное)

00 7F FF FF = 2 -126 ∙(1-2 -23 ) ≈ 1,17549421∙e -38
80 7F FF FF = -2 -126 ∙(1-2 -23 ) ≈ -1,17549421∙e -38
Отсюда видно что минимальное нормализированное число граничит с максимальным денормализированным.

Минимальное денормализованное число (абсолютное)

00 00 00 01 = 2 -126 ∙ 2 -23 = 2 -149 ≈ 1,40129846∙e -45
80 00 00 01 = -2 -126 ∙ 2 -23 = 2 -149 ≈ -1,40129846∙e -45
Это число граничит с нулем.

Максимальное нормализированное число (абсолютное)

7F 7F FF FF = 2 127 ∙(2-2 -23 ) ≈ 3,40282347∙e +38
FF 7F FF FF = -2 127 ∙(2-2 -23 ) ≈ -3,40282347∙e +38
Это число граничит с бесконечностью.

7.2 Полный диапазон чисел одинарной точности (32 бит) по стандарту IEEE754

Рис.4 .Диапазон чисел формата одинарной точности (32 бита) представленных по стандарту IEEE 754

7.3 Полный диапазон чисел двойной точности (64 бит) по стандарту IEEE754

Рис.5 .Диапазон чисел формата двойной точности (64 бита) представленных по стандарту IEEE 754

7.4 Точность представления вещественных чисел в формате IEEE754.

Числа представленные в формате IEEE754 представляют конечное множество, на которое отображается бесконечное множество вещественных чисел. Поэтому исходное число может быть представлено в формате IEEE754 с ошибкой.

Рис.6 Функция ошибки точности представления числа в IEEE754

Абсолютная максимальная ошибка для числа в формате IEEE754 равна в пределе половине шага чисел. Шаг чисел удваивается с увеличением экспоненты двоичного числа на единицу. То есть, чем дальше от нуля, тем шире шаг чисел в формате IEEE754 по числовой оси.

Шаг денормализованных чисел равен 2 (E-149) (Single) и 2 (E-1074) (Double).
Соответственно предел макс. абсолютной ошибки будет равен 1/2 шага числа: 2 (E-150) (Single) и 2 (E-1075) (Double).
Относительная ошибка в % будет равна: (2 (E-150) /F)*100%(Single) и (2 (E-1075) /F)*100% (Double).

Шаг нормализованных чисел равен 2 (E-150) (Single) и 2 (E-1075) (Double).
Соответственно предел макс. абсолютной ошибки будет равен 1/2 шага числа: 2 (E-151) (Single) и 2 (E-1076) (Double).
Относительная ошибка в % будет равна: (2 (E-151) /F)*100%(Single) и (2 (E-1076) /F)*100% (Double).

Максимальная относительная ошибка для денормализованного числа(single/double):

Максимальная относительная ошибка нормализованного числа(single):

Максимальная относительная ошибка нормализованного числа(double):

Таблица 1. Максимальная возможная ошибка для чисел Single
IEEE754, hex число, dec абсолютная ошибка, dec

относительная, %
00000001 2 -149 ≈1,401298e-45 2 -150 ≈0,700649e-45 =50
00000002 2 -148 ≈2,802597e-45 2 -150 ≈0,700649e-45 =25
00000032 ≈7,00649e-44 2 -150 ≈0,700649e-45 =1
007FFFFF ≈1,175494e-38 2 -150 ≈0,700649e-45 ≈5,96e-6
00800001 ≈1,175494e-38 2 -149 ≈1,401298e-45 ≈11,9209e-6
0DA24260 ≈1,0e-30 2 -123 ≈9,4039e-38 ≈9,4039e-6
1E3CE508 ≈1,0e-20 2 -90 ≈8,0779e-28 ≈8,0779e-6
2EDBE6FF ≈1,0e-10 2 -57 ≈6,9389e-18 ≈6,9389e-6
3F800000 ≈1,0 2 -23 ≈1,192e-7 ≈11,9209e-6
41200000 ≈10,0 2 -20 ≈9,5367e-7 ≈9,5367e-6
42C80000 ≈1,0e+2 2 -17 ≈7,6294e-6 ≈7,62939e-6
501502F9 ≈1,0e+10 2 10 ≈1,024e+3 ≈10,24e-6
60AD78EC ≈1,0e+20 2 43 ≈8,7961e+12 ≈8,7961e-6
7149F2CA ≈1,0e+30 2 76 ≈7,5558e+22 ≈7,5558e-6
7F7FFFFF ≈+3,40282e+38 2 104 ≈2,02824e+31 ≈5,96e-6

Таблица 2. Максимальная возможная ошибка для чисел Double
IEEE754, hex число, dec абсолютная ошибка, dec

относительная, %
00000000 00000001 2 -1074 ≈4,940656e-324 2 -1075 ≈2,470328e-324 =50
00000000 00000002 2 -1073 ≈9,881313e-324 2 -1075 ≈2,470328e-324 =25
00000000 00000032 ≈2,470328e-322 2 -1075 ≈2,470328e-324 =1
000FFFFF FFFFFFFF ≈2,225073e-308 2 -1075 ≈2,470328e-324 ≈1,110223e-14
00100000 00000001 ≈2,225074e-308 2 -1074 ≈4,940656e-324 ≈2,220446e-14
2B2BFF2E E48E0530 ≈1,0e-100 2 -385 ≈1,268971e-116 ≈1,268971e-14
3FF00000 00000000 =1,0 2 -52 ≈2,220446e-16 ≈2,220446e-14
54B249AD 2594C37D ≈1,0e+100 2 280 ≈1,942669e+84 ≈1,942669e-14
6974E718 D7D7625A ≈1,0e+200 2 612 ≈1,699641e+184 ≈1,699641e-14
7FEFFFFF FFFFFFFF ≈1,79769e+308 2 971 ≈1,99584e+292 ≈1,110223e-14

Из выше приведенного следует, что основная масса чисел в формате IEEE754 имеет стабильную небольшую относительную погрешность: Максимально возможная относительная погрешность для числа Single составляет 2 -23 *100% =11,920928955078125e-6 %
Максимально возможная относительная погрешность для числа Double составляет 2 -52 *100% =2,2204460492503130808472633361816e-14 %

7.5 Общие сведенья для чисел одинарной и двойной точности стандарта IEEE 754.

Таблица 3. Сведенья о формате 32/64 бит в стандарте ANSI/IEEE Std 754-1985
наименование формата single-precision double-precision
длина числа, бит 32 64
смещенная экспонента (E), бит 8 11
остаток от мантиссы (M), бит 23 52
смещение 127 1023
двоичное денормализованое число (-1) S ∙0,M∙exp2 -127 ,где M-бинарное (-1) S ∙0,M∙exp2 -1023 ,где M-бинарное
двоичное нормализованое число (-1) S ∙1,M∙exp2 (E-127) ,где M-бинарное (-1) S ∙1,M∙exp2 (E-1023) ,где M-бинарное
десятичное денормализованное число F =(-1) S ∙2 (E -126) ∙ M/2 23 F =(-1) S ∙2 (E -1022) ∙M/2 52
десятичное нормализованное число F =(-1) S ∙2 (E-127) ∙(1+ M/2 23 ) F =(-1) S ∙2 (E-1023) ∙(1+M/2 52 )
Абс. макс. возм. погрешность числа 2 (E-150) 2 (E-1075)
Отн. макс. возм. погрешность денорм. числа 1/(2M) 1/(2M)
Отн. макс. возм. погрешность норм. числа 1/(2 24 +2M) 1/(2 53 +2M)
минимальное число ±2 -149 ≈ ±1,40129846∙e -45 ±2 -1074 ≈ ± 4,94065646∙e -324
максимальное число ±2 127 ∙(2-2 -23 ) ≈ ± 3,40282347∙e +38 ±2 1023 ∙(2-2 -52 ) ≈ ± 1,79769313∙e +308


§8. Округление чисел в стандарте IEEE 754.

Стандарт IEEE754 предусматривает четыре способа округления чисел.

    Способы округления чисел по стандарту IEEE 754:
  • Округление стремящееся к ближайшему целому.
  • Округление стремящееся к нулю.
  • Округление стремящееся к +∞
  • Округление стремящееся к -∞

Таблица 3. Примеры округления чисел до десятых
исходное число к ближ. целому к нулю к +∞

к -∞
1,33 1,3 1,3 1,4 1,3
-1,33 -1,3 -1,3 -1,3 -1,4
1,37 1,4 1,3 1,4 1,3
-1,37 -1,4 -1,3 -1,3 -1,4
1,35 1,4 1,3 1,4 1,3
-1,35 -1,4 -1,3 -1,3 -1,4

Как происходит округление показано на примерах в таблице 3. При преобразовании чисел необходимо выбрать один из способов округления. По умолчанию это первый способ -округление к ближайшему целому. Часто в различных устройствах используют второй способ — округление к нулю. При округлении к нулю нужно просто отбросить не значащие разряды числа, поэтому этот способ самый легкий в аппаратной реализации.

§9. Проблемы компьютерных вычислений, вызванные использованием стандарта IEEE754.



Стандарт IEEE 754 широко применяется в технике и программировании.
Большинство современных микропроцессоров изготовляются с аппаратной реализацией представления вещественных переменных в формате IEEE754.
Язык программирования и программист не могут изменить эту ситуацию, иного преставления вещественного числа в микропроцессоре не существует.
Когда создавали стандарт IEEE754-1985 представление вещественной переменной в виде 4 или 8 байт казалось очень большой величиной, так как объём оперативной памяти MS-DOS был равен 1 Мб. А, программа в этой системе могла использовать только 0,64 Мб. Для современных ОС размер в 8 байт является ничтожным, тем не менее переменные в большинстве микропроцессоров продолжают представлять в формате IEEE754-1985.

Рассмотрим ошибки компьютерных вычислений, вызванные применением чисел в формате IEEE754.

9.1 Ошибки связанные с точностью представления вещественных чисел в формате IEEE754. Опасная редукция.

Данная ошибка всегда присутствую в компьютерных вычислениях.
Причина её возникновения описана в п.7.4.
Радует только то, что величина относительной ошибки имеет размерность для single 10 -6 для double 10 -14
Величины абсолютных ошибок могут быть значительными, максимально для single 10 31 и для double 10 292 , что может вызывать определённые проблемы вычислений.

Если пример посчитать на бумажке, то ответ будет 1. Абсолютная ошибка равна +7.
Почему ответ получился неправильным?
Число 123456789 в single=4CEB79A3hex(ieee)=123456792(dec) абсолютная ошибка представления равна +3
Число 123456788 в single=4CEB79A2hex(ieee)=123456784(dec) абсолютная ошибка представления равна -4
Относительная погрешность исходных чисел приблизительно равна 3,24e-6%
В результате одной операции относительная погрешность результата стала 800%, т.е. увеличилась в 2,5e+8 раз.
Это я называю «Опасной редукцией», т.е. катастрофическим понижением точности вычислений в операция где абсолютное значение результата много меньше любого из входного значения переменных.

На самом деле ошибки точности представления числа наиболее безобидные в компьютерных вычислениях, и обычно многие программисты на них не обращают никакого внимания. Тем не менее они вас могут сильно огорчить.

9.2 Ошибки связанные с неправильным приведением типов данных. Дикие ошибки.

Эти ошибки вызваны тем, что исходное число представленное в формате single и в формате double обычно не равны друг другу.
Например: исходное число 123456789,123456789
Single: 4CEB79A3=+123456792,0(dec)
Double: 419D6F34547E6B75=+123456789,12345679104328155517578125
Разница между Single и Double составит:2,87654320895671844482421875

Вот пример на VB:
Относительная погрешность результата равна: &#8734 (бесконечности)
Такую ошибку называют «грязным нулем».
Если переменные привести к одному типу, то этой ошибки не будет.
Поэтому переменные и промежуточные результаты компьютерных вычислений должны быть приведены к одному типу данных.
Например, требование приведения данных к одному типу изложено в стандарте на язык Си ISO/IEC 9899:1999.

Обратите внимание на то, что недостаточно просто привести все исходные данные к одному типу. Необходимо привести также результаты промежуточных операций к одному типу.
Вот пример с ошибкой в промежуточном результате:

Здесь ошибка возникает потому, что промежуточный результат 1/3 в строке c=c-1/3 будет иметь тип double, а не single. Чтобы избавиться от ошибки вам надо привести промежуточный результат к типу single с помощью оператора приведения типов CSng. Пример приведения типа данных для GNU C, присланный Григорием Ситкаревым :

Во втором варианте вы видите, что деление констант в промежуточном результате приведено к типу «float» (одиночная точность в Си). Данные варианты компилировались и исполнялись с помощью «GNU C».
Если компилировать и исполнить показанные выше варианты на VC++ (Visual Studio), то результаты будут обратными. То есть вариант 2 будет иметь результат -9.934108, а вариант 1 Result: 0.000000.
Отсюда можно сделать неутешительный вывод, что результат вычислений может зависеть от типа и версии компилятора. В данном случае можно предположить, что компилятор VC++ автоматически приводит типы переменных, и попытка их насильственного приведения к одному типу заканчивается ошибкой.

Если Вариант 1 (без приведения типов) выполнить с переменными двойной точности (double), то ошибки приведения данных не будет и Result=0.000000
Поэтому в большинстве случаев чтобы избавиться от приведения типов данных надо просто использовать тип данных double и забыть о существовании типа single(float).
Ошибки вычислений вызванные не приведением типов данных я называю «Дикими ошибками», так как они связаны с незнанием стандартов и теории программирования (т.е. с плохим фундаментальным образованием)

9.3 Ошибки вызванные сдвигом мантисс. Циклические дыры.

Эти ошибки связаны с потерей точности результата при неполном пересечении мантисс чисел на числовой оси.
Если мантиссы чисел не пересекаются на числовой оси, то операции сложения и вычитания между этими числами невозможны.
К примеру возьмём число Single: 47FFFFFF = +131071,9921875(dec)
В двоичной системе это число выглядит так: +11111111111111111,1111111

Покажем несколько компьютерных операций сложений и этим числом в формате Single
Значащих цифр в мантиссе двоичного числа в формате Single не более 24
Красным цветом показаны цифры выходящие за этот предел и не участвующие в формате Single

1. сложение с одинаковым числом (ошибка сдвига =0.0).

2. сложение с числом меньшим в 2 раза (ошибка сдвига= — 0.00390625).

3. сложение с числом меньшим в 2 23 раза (ошибка сдвига= — 0.007812).

4. сложение с числом меньшим в 2 24 раза (ошибка сдвига= — 0.007812).

В последнем примере мантиссы чисел разошлись, и арифметические операции с этими числами становятся бессмысленными.

Как видно из приведенных примеров ошибка сдвига возникает если у исходных нормализованных чисел различаются экспоненты. Если числа отличаются более чем в 2 23 (для single) и 2 52 (для double), то операции сложения и вычитания между этими числами не возможны.
Максимальная относительная погрешность результата операции равна примерно 5,96e-6%, что не превышает относительную погрешность представления числа (см.п.9.1).

Хотя с относительной погрешностью здесь всё в порядке, здесь есть другие проблемы.
Во-первых, работать с числами можно только в узком диапазоне числовой оси, где мантиссы пересекаются.
Во-вторых, для каждого исходного числа существует предел выполнения цикла называемый «Циклической дырой». Поясню, если существует цикл в котором исходное число суммируется к сумме, то существует численный предел суммы для этого числа. То есть сумма достигнув определённой величины перестает увеличиваться от сложения её с исходным числом.

Приведу пример циклической дыры в автоматической системе управления:
Имеется фармацевтический цех, производящий таблетки весом 10мг.
Состоящий из: формовочной машины, накопительного бункера на 500 кг, фасовочной машины, автоматической системы управления.
Формовочная машина подает в бункер по 10 таблеток одновременно. Фасовочная машина забирает по одной таблетке.
Автоматическая система управления учитывает таблетки поступившие в бункер от формовочной машины и взятые из бункера фасовочной машиной. То есть существует программа, которая показывает заполнения бункера продукцией в кг. Когда в бункере будет более 500 кг продукции, формовочная машина встает на паузу , она включиться кода в бункере станет 200 кг продукции. Фасовочная машина остановиться если в бункере будет менее 10 кг и запустится когда в бункере будет более 100 кг продукции.
Обе машины могут периодически останавливаться для обслуживания , не зависимо друг от другу (благодаря бункеру).

Как вы понимаете, такая система работает в бесконечном цикле.
Допустим в один из дней фасовочная машина простояла слишком долго и бункер заполнился до 300 кг.
Что произойдет после её включения?

Упрощенный пример работы цикла программы управления: В данном примере фасовочная машина забрала из бункера 100 кг продукции, а вес продукции в бункере не изменился.
Почему не изменился?
Потому, что мантиссы чисел 300 и 0,00001 не пересекаются для формата single.

Далее формовочная машина доведет вес бункера до 500 кг и остановится. Фасовочная машина заберет все таблетки из бункера и тоже остановится. Программа будет показывать вес в бункере 500кг. Прибегут специалисты, проверят датчики, провода, компьютер и скажут что программа зависла. Но, программа не зависала, она продолжает работать без сбоев и любой контроль это подтвердит. Просто число 0,0001 попало в циклическую дыру и выйти из него не может.

В результате нам крупно повезло, что это был фармацевтический цех, а не Саяно-Шушенская ГЭС.

На самом деле опытный программист никогда не будет делать циклическое вычитание(или суммирование) таким образом. Этот пример вымышлен специально, и так считать нельзя, хотя с точки зрения математика здесь всё безупречно. Эта ошибка свойственна математикам и начинающим программистам.
Я бы сказал, что основная работа программиста заключается в борьбе с погрешностями, а не в математических решениях поставленной задачи.

Привожу правильный пример решения этой задачи, любезно предоставленный Ситкаревым Григорием: Показанный выше пример взят из реального промышленного кода.
Для наглядности упростим выше приведенный пример.
Как видно из этого примера, программисту приходится вычислять погрешность результата в каждом цикле, чтобы учесть её в следующем цикле.
Обратите внимание, что программист должен быть абсолютно готов к тому, что некоторые основные понятия математики могут не выполняться при вычислениях в формате IEEE754. Например, правила алгебраической коммутативности (a + b) + с = (a + c) + b, обычно не выполняются при таких вычислениях.
К сожалению, в современном фундаментальном математическом образовании этому вопросу уделяют мало внимания, оставляя решения проблем инструментария на прикладного программиста.

9.4 Ошибки вызванные округлением. Грязный ноль.

При компьютерных вычислениях можно выделить два вида округления:
1. Результат выполненной арифметической операции всегда округляется.
2. Вывод и ввод вещественного числа в окно Windows происходит с округлением.

В первом случае переменная округляется по одному из 4-типов округления IEEE754, по умолчанию округление происходит к ближайшему целому.
При этом переменная принимает новое округлённое значение.
В п.9.2 мы рассматривали сложение двух одинаковых чисел:

1. сложение с одинаковым числом (ошибка сдвига =0.0).

Здесь результат операции сложения двух чисел абсолютно точен, но результат был округлен микропроцессором. Таким образом к точному результату была добавлена ошибка округления. В общем случае ошибка округления находится в пределах точности числа.

Во втором случае переменная не меняет своего значения, просто в окно Windows выводится округлённое значение вещественного числа. Получается, что исходная переменная и её отображение в окне Windows это разные числа. Это не ошибка формата IEEE754, это ошибка Windows.
Для переменных типа Single в окне Windows отображается 7 значащих цифр округлённых до ближайшего целого.
3DFCD6EA =+0,12345679104328155517578125 в окне отображается как 0,1234568
Для переменных типа Double в окне Windows отображается 15 значащих цифр округлённых до ближайшего целого.
3FBF9ADD3746F67D=+0,12345678901234609370352046653351862914860248565673828125 отображается как 0,123456789012346

Вопрос какое значение имеет переменная когда мы вводим в окно Windows 0,123456789012346 ?
Это значение будет равно такому числу:
3FBF9ADD3746F676=+0,1234567890123459965590058118323213420808315277099609375
То есть значение переменной 3FBF9ADD3746F67D мы вообще не можем вставить напрямую в код программы.
Но, мы можем схитрить и вставить в программу x=0.123456789012346 +1E-16. Полученная переменная будет равна 3FBF9ADD3746F67D (это используется в примере с грязным нулём)
Отобразить или вести через окно ПК такое число невозможно.

В результате действий Windows возникает ряд неприятных ситуаций.
1. У вас нет технической возможности отображать или вводить точные значения переменных в окнах, что само по себе очень печально.
2. Возникновение серьёзных ошибок, таких как грязный ноль.
«Грязный ноль» это когда вы или программа считаете, что переменная не равная нулю — равна нулю


Очень часто эта ошибка возникает в интерфейсе «оператор-машина».
Например, при обнулении тары в весовых программах.

Результат выполнения программы приведенного выше примера

В результате переменную, которую оператор считает нулем — нулю не равна
Относительная погрешность результата равна бесконечности.
В логических операциях сравнения этот не ноль может увести исполнение программы в другую ветвь алгоритма.

9.5 Ошибки на границе норма/денорма числа. Числа убийцы.

Эти ошибки возникают при работе с числами находящимися на границе нормализованного/денормализованного представления чисел. Они связанны с различием в представление чисел в формате IEEE754 и в различии формул перевода формата IEEE754 в вещественные числа. То есть устройства (или программы) должны применять различные алгоритмы в зависимости от положения вещественного числа на числовой оси формата. Кроме того, что это приводит к усложнению устройств и алгоритмов, ещё возникает неопределённость переходной зоны. Неопределённость переходной зоны заключается в том, что стандарт не определяет конкретного значения границы перехода. По сути дела граница перехода находится между двумя вещественными числами:
Последним денормализованным числом 000FFFFFFFFFFFFF:
Точное десятичное значение этого числа:
+2,2250738585072008890245868760858598876504231122409594654935248025624400092282356951787758888037591552642309780950
4343120858773871583572918219930202943792242235598198275012420417889695713117910822610439719796040004548973919380791
9893608152561311337614984204327175103362739154978273159414382813627511383860409424946494228631669542910508020201592
6642134996606517803095075913058719846423906068637102005108723282784678843631944515866135041223479014792369585208321
5976210663754016137365830441936037147783553066828345356340050740730401356029680463759185831631242245215992625464943
0083685186171942241764645513713542013221703137049658321015465406803539741790602258950302350193751977303094576317321
0852507299305089761582519159720757232455434770912461317493580281734466552734375e-308

и первым нормализованным числом 0010000000000000:
Точное десятичное значение этого числа:
+2,2250738585072013830902327173324040642192159804623318305533274168872044348139181958542831590125110205640673397310
3581100515243416155346010885601238537771882113077799353200233047961014744258363607192156504694250373420837525080665
0616658158948720491179968591639648500635908770118304874799780887753749949451580451605050915399856582470818645113537
9358049921159810857660519924333521143523901487956996095912888916029926415110634663133936634775865130293717620473256
3178148566435087212282863764204484681140761391147706280168985324411002416144742161856716615054015428508471675290190
3161322778896729707373123334086988983175067838846926092773977972858659654941091369095406136467568702398678315290680
984617210924625396728515625e-308
Так как граница является вещественным числом, то её точность можно задавать до бесконечности и цифровому устройству или программе может не хватить разрядности для принятия решения к какому диапазону отнести данное число.

Для примера можно привести баг №53632 для PHP, который вызвал панику в начале 2011 года &lt html&gt &ltbody&gt &lt?php $d = 2.2250738585072011e-308; ?&gt end &lt/body&gt &lt/html&gt
Ввод числа 2.2250738585072011e-308 вызывал зависание процесса почти с 100% загрузкой CPU.
Другие числа из этого диапазона проблем не вызвали (2.2250738585072009e-308, 2.2250738585072010e-308, 2.2250738585072012e-308)
Сообщение о баге поступило 30.12.2010, исправлено разработчиком 10.01.2011.
Так как PHP препроцессор используют большинство серверов, то у любого пользователя сети в течение 10 дней была возможность «вырубить» любой сервер.
Как пишут разработчики, что этот баг работает только в 32-х разрядных системах, но если повысить точность граничного числа, то я думаю, что и 64-х разрядные системы тоже повиснут (не проверено!).
Причина паники понятна: любой пользователь сети, при определённом уровне усердия и знания, имел возможность «вырубить» большую часть информационных ресурсов планеты в течении десяти дней.
Не хотелось — бы приводить ещё примеры таких чисел и таких ошибок.

§10 Заключение.

Из сказанного выше видно, что мнение о том, что при вычислениях с плавающей точкой результат не выходит за пределы относительной погрешности представления наибольшего числа является ложным. Ошибки перечисленные в п.9 складываются друг с другом. Такие ошибки как грязный ноль и опасная редукция могут сделать погрешность вычислений неприемлемой. Особое внимание при программировании компьютерных вычислений программист должен обратить на результаты близкие к нулю.

Некоторые специалисты считают, что этот формат чисел представляет угрозу человечеству.
Вы можете прочитать об этом в статье IEEE754-тика угрожает человечеству &nbsp
Хотя многие факты из этой статьи излишне драматизированы, и возможно неправильно интерпретированы, но проблема компьютерных вычислений философски отражена правильно.

Я не сторонник драматизации вычислений по стандарту IEEE754. Стандарт работает с 1985 года и полностью вошел в стандарт IEEE754-2008, который расширил точность вычислений. Но, проблема достоверности компьютерных вычислений сегодня очень актуальна, и стандарт IEEE754-2008 и рекомендации ISO не решили эту проблему. Я думаю, в этой области нужна инновационная идея, которой разработчики стандарта IEEE754-2008 к сожалению не обладают.

Инновационные идеи, как правило, приходят со стороны.
Основные инновационные идеи в нашем мире были выдвинуты любителями (людьми мыслящими не за деньги).
Ярким примером такой ситуации было изобретение телефона.
Когда школьный учитель Александр Белл (Alexander Graham Bell) пришел с патентом на изобретение телефона к президенту телекоммуникационной компании Western Union Company, которая владела трансатлантическим кабелем связи, с предложением купить у него патент на изобретение телефона, он его не выгнал — нет. Президент этой компании предложил рассмотреть этот вопрос совету экспертов в области телеграфии, состоящему из специалистов и ученых в области телекоммуникаций. Эксперты дали заключение, что это изобретение бесполезно в области телекоммуникаций и оно бесперспективно.
Некоторые специалисты даже написали в отчете, что это циркачество и шарлатанство !
&nbsp &nbsp Александр Белл, вместе со своим тестем, решил самостоятельно продвигать своё изобретение. Примерно через 10 лет, гигант телекоммуникаций Western Union Co., был фактически вытеснен телефонным бизнесом из сферы телекоммуникационных технологий . Сегодня вы можете увидеть во многих российских городах окошки с надписью Western Union, эта компания которая занимается переводом денег по всему миру, а когда-то она была международным гигантом телекоммуникаций.
&nbsp &nbsp Отсюда можно сделать вывод: мнения экспертов в инновационных технологиях бесполезны!
Если Вы думает что с момента изобретения телефона (1877 г.) в головах людей что-то изменилось, то вы ошибаетесь.

Если ученые(которые придумывают новое) и специалисты (которые знают как пользоваться известным) не могут решить проблему, то нужна инновация.

Ссылки на новые идеи в области представления вещественных чисел в аппаратных средствах:
1. Аппроксиметика &nbsp
2. .
Если вы знаете другие инновационные идей в области представления вещественных чисел, то буду рад получить ссылки на эти источники.

Можно представлять вещественные числа, как числа с фиксированной запятой. Для представления всего диапазона чисел Double достаточно иметь переменную состоящую из 1075 битов целой части и 1075 битов дробной части, т.е. около 270 байт на одну переменную. При этом все числа будут представлены с одинаковой абсолютной точностью. Можно работать с числами во всем диапазоне числовой оси, то есть становится возможным суммировать большие числа с малыми числами. Шаг чисел по числовой оси будет равномерен, то есть числовая ось будет линейна. Тип данных будет только один, т.е. не нужны целые, вещественные и др. типы. Здесь возникает проблема реализации регистров микропроцессоров размерностью в 270 байт, но это не проблема для современной технологии.

Для написания п.9 мне пришлось создать программу которая представляет числа в виде переменной с фиксированной точкой, длиною 1075,1075 байтов. Где число можно представить в виде строки символов ASCII, то есть один символ равен одному числовому разряду. Так же пришлось написать все арифметические операции при работе со строками ASCII. Это программа является аналогом бумажного расчета. Так как математические способности микропроцессора в ней не используются, то считает она довольно медленно. Зачем я это сделал?
Я не смог найти программы, которая смогла бы точно представить число формата IEEE754 в десятичном виде.
Так же я не нашел программы (хотя они безусловно есть, в чём нет сомнений) где в окно можно ввести 1075 значащих десятичных цифр.

Вот к примеру точно десятичное значение числа double 7FEFFFFFFFFFFFFF:
+17976931348623157081452742373170435679807056752584499659891747680315726078002853876058955 863276687817154045895351438246423432132688946418276846754670353751698604991057655128207624 549009038932894407586850845513394230458323690322294816580855933212334827479782620414472316 8738177180919299881250404026184124858368,0

Вы можете воспользоваться программой IEEE754 v.1.0 &nbsp
для изучения и оценки погрешностей при работе с вещественными числами представленными в формате IEEE754.

Список литературы:
1. IEEE Standard for Binary Floating-Point Arithmetic. Copyright 1985 by The Institute of Electrical and Electronics Engineers, Inc 345 East 47th Street, New York, NY 10017, USA

Представление чисел в двоичном коде с плавающей запятой

Часто приходится обрабатывать очень большие числа (например, расстояние между звёздами) или наоборот очень маленькие числа (например, размеры атомов или электронов). При таких вычислениях пришлось бы использовать числа с очень большой разрядностью. В то же время нам не нужно знать расстояние между звёздами с точностью до миллиметра. Для вычислений с такими величинами числа с фиксированной запятой неэффективны.

В десятичной арифметике для записи таких чисел используется алгебраическая форма. При этом число записывается в виде мантиссы, умноженной на 10 в степени, отображающей порядок числа, Например:

0,2×10 5 ;
0,16×10 -38

Для записи двоичных чисел тоже используется такая форма записи. Она позволяет работать с числами с большим диапазоном значений Эта форма записи называется запись числа с плавающей точкой. Напомним, что мантисса не может быть больше единицы и после запятой в мантиссе не можетзаписываться ноль.

В программировании для записи таких чисел используются специальные форматы переменных. В языке СИ это такие форматы как float и double. Они описываются стандартом . Этих же стандартов придерживается большинство других языков программирования. При работе с числами с плавающей запятой в составе языка программирования обычно не возникает трудностей. Все преобразования форматов чисел осуществляются средствами самого языка программирования. Однако при передаче данных или при работе с микроконтроллерами часто приходится писать программу на языке программирования ассемблер и тогда может потребоваться знание внутреннего представления этих чисел.

Для записи числа в формате с плавающей запятой одинарной точности требуется тридцатидвухбитовое слово. Для записи чисел с двойной точностью требуется шестидесятичетырёхбитовое слово. Чаще всего числа хранятся в нескольких соседних ячейках памяти процессора. Форматы числа в формате с плавающей запятой одинарной точности и числа в формате с плавающей запятой удвоенной точности приведены на рисунке

Рисунок 1. Форматы числа с плавающей запятой

На рисунке буквой S обозначен знак числа, 0 — это положительное число, 1 — отрицательное число.

Группа бит, обозначенная e предназначена для записи смещённого порядка числа. Смещение потребовалось, чтобы не вводить в двоичный код числа с плавающей запятой еще один знак. Смещённый порядок всегда является положительным числом. В двоичном коде одинарной точности float для записи порядка числа выделено восемь бит. Для него смещение порядка числа принято 127. Для смещённого порядка в двоичном коде числа с плавающей запятой двойной точности double отводится 11 бит. В нем смещение порядка числа составляет — 1023.

В десятичной мантиссе после запятой могут присутствовать цифры 1. 9, а в двоичной — только 1. Поэтому для хранения единицы после двоичной запятой не выделяется отдельный бит в числе с плавающей запятой. Единица подразумевается, как и двоичная запятая. Кроме того, в формате чисел с плавающей запятой принято, что мантисса всегда больше 1. То есть диапазон значений мантиссы лежит в диапазоне от 1 до 2.

Рассмотрим несколько примеров:

1) Определить число с плавающей запятой, лежащее в четырёх соседних байтах:

11000001 01001000 00000000 00000000

— Знаковый бит, равный 1 показывает, что число отрицательное.

— Экспонента 10000010 в десятичном виде соответствует числу 130. Вычтя число 127 из 130, получим число 3.

— Теперь запишем мантиссу: 1,100 1000 0000 0000 0000 0000

— И, наконец, определим десятичное число: 1100,1b = 12,5d


2) Определить число с плавающей запятой, лежащее в четырёх соседних байтах:

11000011 00110100 00000000 00000000

— Знаковый бит, равный 1 показывает, что число отрицательное.

— Экспонента 10000110 в десятичном виде соответствует числу 134. Вычтя число 127 из 134, получим число 7.

— Теперь запишем мантиссу: 1,011 0100 0000 0000 0000 0000

— И, наконец, определим десятичное число: 10110100b=180d

Для того чтобы записать ноль, в двоичном представлении числа с плавающей запятой достаточно записать в смещенный порядок число 00000000b. Значение мантиссы при этом не имеет значения. Число, в котором все байты равны 0, тоже попадает в этот диапазон значений.

Бесконечность в числе с плавающей запятой соответствует смещенному порядку 11111111b и мантиссе, равной 1,0. При этом существует минус бесконечность и плюс бесконечность (переполнение и антипереполнение), которые часто отображаются на экран монитора компьютера или дисплей микропроцессорного устройства как +INF и -INF.

Все остальные комбинации битов мантиссы числа с плавающей запятой (в том числе и все единицы) при смещенном порядке 11111111b воспринимаются языками программирования как не числа и отображаются на экран: NaN.

Другие виды двоичных кодов:

Целочисленные двоичные коды Представление двоичных чисел в памяти компьютера или микроконтроллера
http://digteh.ru/proc/IntCod.php

Двоично-десятичный код Иногда бывает удобно хранить числа в памяти процессора в десятичном виде
http://digteh.ru/proc/DecCod.php

Запись текстов двоичным кодом Представление текстов в памяти компьютеров и микроконтроллеров
http://digteh.ru/proc/text.php

Системы счисления В настоящее время и в технике и в быту широко используются как позиционные, так и непозиционные системы счисления.
http://digteh.ru/digital/SysSchis.php

Автор Микушин А. В. All rights reserved. 2001 . 2020

Числа с плавающей точкой

Машинный способ выполнения арифметических операций над числами с плавающей точкой очень легко понять, если провести аналогию между ним и обычным способом выполнения арифметических операций над числами, представленными в виде чисел с порядком. Например, 356400 в форме с порядком может быть записано как 3.564 Х105. Вообще число в форме с порядком выглядит как произведение двух чисел, одно из которых является степенью 10. В машинах фирмы IBM числа с плавающей точкой имеют примерно такой же вид, только в качестве основания системы счисления берется не 10, а 16. Число с плавающей точкой в шестнадцатеричной системе записывается как

дробная часть X 16″

Мы требуем, чтобы абсолютная величина дробной части была меньше 1. Число п называется порядком числа с плавающей точкой. (Часто дробная часть называется мантиссой).

Требование, чтобы абсолютная величина мантиссы не превышала 1, означает, что все ее значащие цифры должны располагаться после шестнадцатеричной точки. Например, .СЗАХ162 является представлением числа СЗ.А1в, а .10ЕХ16-3 — представлением числа .00010Е16.

Алгоритм выполнения арифметических операций над числами с порядком в десятичной системе ничем не отличается от соответствующего алгоритма для шестнадцатеричной системы. Для того чтобы сложить два числа, сначала выравнивают их порядки, производя сдвиг мантиссы одного из них, а затем мантиссы складывают. При умножении мантиссы перемножаются, а порядки складываются. Проверьте справедливость следующих равенств:

. 1С2 X 16 3 —. 8Е X 16 3 = . 1С2 X 16 3 »— .08Е X 16 3 = . 134 X 16 3

(.ЗА х 16 3 ) X (.42 X 16 2 )= .EF4X 16 5

Проведение вручную преобразований чисел с плавающей точкой из десятичной системы в шестнадцатеричную достаточно утомительно, но возможно. Например,

С1 16 Х 16 3 =(12х 16 -1 +1 X 16) -2 Х 16 3 = 12 х16 2 + 1х16=308810

Посмотрим теперь, как выполняются подобные операции машинами фирмы IBM.

Внутреннее представление

Число в форме с плавающей точкой представляет собой совокупность знака, порядка и мантиссы. В машинном представлении чисел с плавающей точкой нулевой бит всегда несет информацию о знаке числа: 0 соответствует плюсу и 1 — минусу. Следующие 7 битов отведены под характеристику, являющуюся внутренней формой представления порядка. Остальное место занимает мантисса.

Знак. Числа с плавающей точкой, одинаковые по абсолютной величине, но имеющие разные знаки, отличаются друг от друга во внутреннем представлении лишь содержимым знакового разряда. Заметим, что в случае двоичной целочисленной арифметики дело обстояло совсем не так: отрицательные числа представлялись в дополнительном коде. Для умножения числа, представленного в форме с плавающей точкой, на —1 достаточно лишь изменить значение его знакового разряда. Мантисса чисел с плавающей точкой во внутреннем представлении фактически представляет собой абсолютную величину мантиссы. Умножив С380315Е на —1, мы получим 4380315Е.

Характеристика. Поскольку характеристика представлена 7-раз-рядным двоичным числом, ее значение может находиться в пределах от 00 до 7F16 или от 0 до 12710. Если бы в поле характеристики записывался в явном виде порядок числа, то мы имели бы числа исключительно с положительными порядками. Для того чтобы получить возможность пользоваться и числами с отрицательными порядками, в поле характеристики записывают число, превосходящее истинное значение порядка на 6410. Такое представление порядка называется представлением относительно числа 64. Минимальное значение характеристики равно 00000002. Минимальное значение порядка на 64 меньше, т. е. равно — 64. Аналогично, поскольку максимальное значение характеристики равно 12710, то, значит, в машине могут представляться лишь числа, порядок которых не превышает 6310. Итак, в машине представимы числа с плавающей точкой, находящиеся в интервале от 16-61 до 16+03, т. е. приблизительно от 5.4Х10-78 до 7.2X10’*.

Найти значение характеристики, соответствующее данному значению порядка, можно так: сначала преобразовать исходное значение порядка в двоичную форму, а затем, используя арифметику дополнительных кодов, прибавить к нему 6410 = Ю000002. Например, если порядок равен 1310, то характеристика вычисляется так:

Аналогично, если порядок равен — 5, то характеристика

Отметим, что знак порядка может быть легко определен по первому биту характеристики: если этот бит равен 1, то порядок положителен, если 0 — то отрицателен. Это, возможно, несколько непривычно, но тем не менее это так.

Мантисса. ЭВМ Систем 360 и 370 предоставляют возможность выполнения арифметических операций над числами с плавающей точкой двух форматов. Короткие числа с плавающей точкой занимают 32 разряда, т. е. полное слово памяти. Под знак и характеристику отведено 8 разрядов; таким образом, короткие числа имеют 24-разрядную мантиссу. Длинные числа с плавающей точкой состоят из 64-х битов, т. е. занимают двойное слово. Мантисса таких чисел содержит 56 битов.

В гл. 2 мы видели, что многие десятичные дроби не могут быть точно представлены в виде конечных двоичных. Например,

Для того чтобы точно представить подобные числа в машине, требуется бесконечное количество разрядов, так как в двоичной форме они представляются в виде бесконечных периодических дробей. При представлении таких чисел в реальных машинах допускаются ошибки округления.

Конечно, чем больше разрядов отводится для представления числа, тем выше точность этого представления. В связи с этим обычно возникает вопрос, какова точность аппроксимации десятичных дробей двоичными?


Для ответа на этот вопрос выясним, насколько отличаются числа, не совпадающие только в последнем разряде. Если дробные части чисел состоят из N битов, то разница будет 2 — N . Изменяя содержимое последнего разряда 4-разрядного дробного числа, мы изменим его величину на 2 -4 =1/16. Оценить соответствующую величину десятичного приращения можно, решив уравнение

Решить это уравнение можно, взяв десятичный логарифм от обеих частей:

N log10 2; х = N log10 2

Возвращаясь к представлению чисел в виде коротких чисел с плавающей точкой, имеем x=0.3×24=7.2

Рис. 19.1. Короткий, длинный и расширенный форматы чисел с плавающей точкой. S — бит знака.

Итак, используя 24 разряда для представления мантиссы чисел, мы получаем относительную точность их машинного представления в пределах 10 -7,2 . Другими словами, относительная точность представления чисел в случае одинарной точности (короткие числа с плавающей точкой) равна приблизительно 10 -7 . Аналогичные вычисления показывают, что при операциях удвоенной точности (длинные числа) можно получить относительную точность представления приблизительно 10 -18 . Мы получили оценки точности, обеспечиваемой при машинном представлении чисел с плавающей точкой. В дальнейшем мы увидим, что ошибки округления, возникающие при использовании арифметики с плавающей точкой, могут быть столь велики, что конечные результаты практически теряют всякий смысл.

Модель 85 Системы 360 и модели Системы 370 позволяют оперировать с числами, представленными в так называемом расширенном формате. С помощью такого формата достигается еще более высокая точность. Число, записанное в расширенном формате, занимает четыре полных слова. Первое двойное слово имеет тот же формат, что и в случае длинного числа. Однако знак и характеристика относятся ко всему 128-разрядному числу. На самом деле для записи числа используются только 120 разрядов, поскольку содержимое полей знака и характеристики второго двойного слова игнорируется. Итак, мантисса таких чисел имеет 128—16=112 разрядов. При этом относительная точность повышается до 10 -36 .

На рис. 19.1 изображены все форматы представления чисел с плавающей точкой в машинах фирмы IBM. Как же определить число по его внутреннему представлению? Для ответа на этот вопрос число разбивается на три части. Рассмотрим, например, короткое число

Поскольку нулевой бит равен 0, число положительно. Характеристика равна 43,в=6710; вычитая 64, получим значение порядка, равное 3. Мантисса равна .00С00016. Таким образом, искомое значение получится переводом числа

в десятичную форму. Окончательно получаем результат

.C00000X 161 = 1210

отрицательно, поскольку нулевой бит равен 1. Характеристика равна 25lg=3710, т. е. порядок равен —27,0. Получаем, что представленное число равно

Точно так же определяются значения чисел, представленных в двойном и расширенном форматах. Единственное отличие заключается в длине мантиссы.

Нормализация. Число с плавающей точкой называется нормализованным, если первая шестнадцатеричная цифра его мантиссы отлична от 0. На самом деле в нормализованном виде числа представляются наиболее точно, поскольку реально используются все разряды мантиссы. Рассмотрим нормализованное представление в коротком формате числа .2. Оно выглядит так:

Точность чуть больше чем 10

7. В ненормализованном виде это же число может быть записано, например, как

В данном случае реально используется всего 12 из 24 двоичных разрядов мантиссы. Теперь уже точность представления оказывается меньше 10-4. Аналогичные рассуждения можно провести относительно длинных и расширенных чисел. Использование ненормализованных чисел обычно ведет к уменьшению общей точности вычислений.

Для нормализации числа нужно выполнят^ последовательные сдвиги его мантиссы на четыре двоичных разряда каждый раз с одновременным вычитанием 1 из характеристики до тех пор, пока первая шестнадцатеричная цифра мантиссы не окажется отличной от 0. Нормализовав длинное число

Значение характеристики числа во время нормализации уменьшилось на поскольку было выполнено три 4-разрядных сдвига мантиссы. В процессе нормализации младшие разряды заполнились нулями. При выполнении арифметических операций, как мы увидим в дальнейшем, дело обстоит несколько сложнее, чем здесь описано.

Операнды команд с плавающей точкой

Команды арифметики с плавающей точкой бывают форматов RR и RX. Операнд команд формата RX, находящийся в памяти, в случае выполнения операций над числами, представленными в коротком формате, выровнен по границе полного слова. Выполнение операций над числами, представленными в расширенном формате, производится почти исключительно с помощью команд формата RR. В этом случае в качестве операндов выступают так называемые регистры с плавающей точкой (FP). Эти специальные регистры не следует путать с регистрами общего назначения (GP,). FP-регистров всего восемь. Им присвоены номера от 0 до 7. Но только четные регистры могут выступать в качестве операндов команд арифметики с плавающей точкой в случае, когда обрабатываемые числа имеют.короткий или длинный формат. Для выполнения операций над числами, представленными в расширенном формате, можно использовать только регистры 0 и 4. Несоблюдение этих правил приводит к особому случаю спецификации.

Каждый регистр с плавающей точкой является 32-разрядным. Четные регистры содержат байт, представляющий знак и характеристику числа, а также 24 разряда мантиссы. В нечетных регистрах записываются 32-разрйдные части мантисс. Это означает, что каждая пара, состоящая из четного и нечетного регистров с последовательными номерами, может быть использована для хранения числа, представленного в длинном формате. В выполнении операций над короткими числами нечетные регистры не участвуют. Расширенные числа могут находиться либо в регистрах 0—3, либо в регистрах 4—7.

Регистры, использующиеся в качестве первых операндов в RR- или RX-командах арифметики с плавающей точкой, играют роль накопителей, аналогично тому как это имеет место в командах целочисленной арифметики.

Арифметика

Порядок машинного выполнения операций над числами с плавающей точкой мало чем отличается от порядка ручного выполнения этих операций. Единственным серьезным отличием является то, что числа, представленные в машине, имеют фиксированную длину. Описываемые ниже алгоритмы применимы ко всем видам внутреннего представления чисел с плавающей точкой.

Непосредственному выполнению сложения и вычитания предшествует так называемая предварительная нормализация. При этом сравниваются характеристики операндов. Если они равны между собой, то производится сложение или вычитание мантисс в зависимости от выполняемой операции и содержимого знаковых разрядов операндов. Если же характеристики различны, то происходит их выравнивание. Меньший порядок увеличивается до значения большего, и одновременно происходит сдвиг мантиссы соответствующего числа с меньшим порядком. Увеличению порядка на 1 соответствует сдвиг мантиссы вправо на 4 разряда. При этом последняя выдвинутая за пределы разрядной сетки шестнадцатеричная цифра сохраняется. Процесс продолжается до тех пор, пока значения характеристик не совпадут. После этого выполняется сложение или вычитание мантисс.

Мы можем потребовать, чтобы результат сложения или вычитания нормализовался или не нормализовался. При нормализации результата сохраненная шестнадцатеричная цифра перемещается в младшие разряды мантиссы. Таким образом, достигается несколько большая точность, чем та, которая гарантируется использованием короткого, длинного или расширенного форматов соответственно.

Вычислим, например, сумму двух коротких чисел с плавающей точкой.

Значения характеристик обоих чисел совпадают и равны ЗВ1в. Следовательно, предварительную нормализацию в данном случае выполнять не нужно. Первоначально дополнительные младшие разряды обоих чисел содержали нули. Поскольку преднормализация, а следовательно, и сдвиги мантисс не выполняются, то перед непосредственным началом сложения в этих разрядах также будут нули. Второе число является отрицательным, поэтому его мантисса вычитается из мантиссы первого числа. Нормализованная сумма выглядит так:

требует предварительной нормализации, поскольку значения характеристик слагаемых — разные. Меньшим является значение характеристики первого числа, в процессе нормализации его мантисса будет сдвинута на три позиции вправо:

В результате сразу же получится нормализованное число

При умножении также производится предварительная нормализация операндов. Значение характеристики произведения равно сумме значений характеристик сомножителей минус 4016. Производится умножение мантисс, и при необходимости результат нормализуется. Вычислим, например, произведение

Второй сомножитель не нормализован, поэтому его мантисса сдвигается на один разряд влево и одновременно значение характеристики уменьшается на 1. Значение характеристики произведения

вычисляется следующим образом:

Произведение мантисс равно

300000 х 42АЗ10=ОС7Е93000000

Итак, предварительно результат записывается в виде

В данном случае первая, выходящая за пределы разрядной сетки, цифра произведения есть 0. Если бы это было не так, то она добавлялась бы к значению произведения для повышения точности вычислений. В данном случае дополнительная цифра есть 0, поскольку один из операндов оказался нормализованным.


Деление чисел с плавающей точкой также начинается с нормализации. Значение характеристики делителя вычитается из значения характеристики делимого и к результату добавляется 4010:

характеристика частного = характеристика делимого — характеристика делителя + 4016

Нормализация частного иногда не требуется, однако возможна ситуация, когда мантисса частного после выполнения деления сдвигается на одну позицию вправо.

Разделим, используя арифметику с плавающей точкой, 0.3×16 2 на 0.9Х16 3 . Иначе говоря, требуется вычислить частное:

Характеристика частного вычисляется следующим образом:

42—43 +40 =82—43 = 3F

что соответствует порядку —1. Результатом деления мантисс является бесконечная дробь .5555555. т. е. 1/3 в шестнадцатеричной форме. Поэтому частное в машинном представлении будет выглядеть так

Констатны с плавающей точкой

Константы короткие, длинные и расширенные фигурируют в языке ассемблера как константы типовЕ, D и L соответственно. Значения констант записываются в десятичной форме. Например, с помощью предложений

определяются три константы, имеющие различные форматы, но одно и то же значение, а именно .003. Е-константы автоматически выравниваются по границам слов, a D- и L-константы выравниваются по границам двойных слов.

При желании константы можно записывать непосредственно в форме с плавающей точкой, указывая в них соответствующие степени 10. Степень 10 записывается в виде буквыЕ со следующим за ней значением показателя.

AVOG DC D’6.023E23′

определяется длинная константа с плавающей точкой со значением 6.023 X 10м, а предложением

— константа со значением 10

Значения порядков можно задавать другим способом, указывая их непосредственно перед значением самой константы. Следующие два предложения эквивалентны двум предшествующим:

AVOG DC DE23’6.023′

Значение показателя, выведенное за апострофы, относится ко всем числам, указанным внутри их. Например,

является определением трех коротких констант, которые будут загружены в память, начиная с ячейки THOU. Значениями этих констант являются соответственно 10000, 20000, 30000.

Литералы, соответствующие константам с плавающей точкой, записываются аналогично. Например, по команде

Формат представления чисел с плавающей запятой

Правила ввода чисел

  1. Числа в десятичной системе счисления могут вводиться как без дробной, так и с дробной частью ( 234234.455 ).
  2. Числа в двоичной системе счисления состоят только из цифр 0 и 1 ( 10100.01 ).
  3. Числа в шестнадцатеричной системе счисления состоят из цифр 0 . 9 и букв A . F .
  4. Можно также получать обратное представление кода (из шестнадцатеричной системы счисления в десятичную, 40B00000 )

Пример №2 . Представить двоичное число 101.102 в нормализованном виде, записать в 32-битом стандарте IEEE754.
Решение.
Представление двоичного числа с плавающей точкой в экспоненциальном нормализованном виде.
Сдвинем число на 2 разрядов вправо. В результате мы получили основные составляющие экспоненциального нормализованного двоичного числа:
Мантисса M=1.011
Экспонента exp2=2
Преобразование двоичного нормализованного числа в 32 битный формат IEEE 754.
Первый бит отводится для обозначения знака числа. Поскольку число положительное, то первый бит равен 0
Следующие 8 бит (с 2-го по 9-й) отведены под экспоненту.
Для определения знака экспоненты, чтобы не вводить ещё один бит знака, добавляют смещение к экспоненте в половину байта +127. Таким образом, наша экспонента: 2 + 127 = 129
Переведем экспоненту в двоичное представление.
Оставшиеся 23 бита отводят для мантиссы. У нормализованной двоичной мантиссы первый бит всегда равен 1, так как число лежит в диапазоне 1 ≤ M 22 *0 + 2 21 *1 + 2 20 *1 + 2 19 *0 + 2 18 *0 + 2 17 *0 + 2 16 *0 + 2 15 *0 + 2 14 *0 + 2 13 *0 + 2 12 *0 + 2 11 *0 + 2 10 *0 + 2 9 *0 + 2 8 *0 + 2 7 *0 + 2 6 *0 + 2 5 *0 + 2 4 *0 + 2 3 *0 + 2 2 *0 + 2 1 *0 + 2 0 *0 = 0 + 2097152 + 1048576 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 = 3145728
В десятичном коде мантисса выражается числом 3145728
В результате число 101.10 представленное в IEEE 754 c одинарной точностью равно 01000000101100000000000000000000.
Переведем в шестнадцатеричное представление.
Разделим исходный код на группы по 4 разряда.
010000001011000000000000000000002 = 0100 0000 1011 0000 0000 0000 0000 0000 2
Получаем число:
0100 0000 1011 0000 0000 0000 0000 0000 2 = 40B0000016

Числа с плавающей точкой

Читайте также:

  1. A. Перевод целой части числа из P-ичной системы счисления в десятичную.
  2. I Выполнение операций в АЛУ для чисел с фиксированной точкой
  3. Алгебраическое сложение чисел, представленных в форме с плавающей запятой
  4. Алгоритм представления числа с плавающей запятой.
  5. Арифметические действия над нормализованными числами
  6. Арифметические действия с двоичными числами.
  7. Арифметические операции над двоичными числами
  8. Болезни, вызванные изменениями числа аутосом.
  9. Вероятностью события А называется отношение числа исходов, благоприятных событию А, к числу всех исходов испытания.
  10. Вещественные числа
  11. Вещественные числа
  12. Выполнение арифметических операций с числами с фиксированной и плавающей запятой

Для очень больших и очень маленьких чисел неудобно и нецелесообразно выписывать много нулей в конце числа или в начале после запятой. В связи с этим и возникла экспоненциальная форма записи. (Эту форму иногда называют научной, так как именно в научных задачах часто приходится иметь дело с очень маленькими или очень большими числами.)

Длину отрезка в экспоненциальной форме записи можно представить так: 478 × 10 3 микрон; 4,78 × 10 –1 м.

Точность числа определяется не его длиной, а количеством верных значащих цифр. Задание же всех величин с точностью до 256 бит (или примерно 76 десятичных цифр) — дело не только нереальное, но и бессмысленное, хотя бы потому, что многие из этих величин получаются в результате измерений не очень точными приборами. Не случайно в практических расчетах редко используют более трех значащих цифр, соответствующим образом округляя промежуточные результаты.

Для хранения в памяти ЭВМ чисел с небольшим количеством значащих цифр целесообразно представлять их в экспоненциальной форме. В приведенном выше примере это представление может иметь вид:

4,72 × 10 5 микрон; 472 × 10 3 микрон; 4720 × 10 2 микрон;

4,72 × 10 -4 км; 47,2 × 10 -5 км; 472 × 10 -6 км.


Из этого примера видно, что положение запятой в записи числа может изменяться. Поэтому представление в ЭВМ числа в экспоненциальной форме называетсяпредставлением с плавающей точкой (запятой). Кроме того, экспоненциальную форму называют еще полулогарифмической или нормальной.

Любое число А в экспоненциальной форме представляется в виде

А = mA × q p ,

где mA мантисса числа; q — основание системы счисления, р —порядок числа.

Для однозначности представления чисел с плавающей точкой используется нормализованная форма, при которой мантисса отвечает условию:

Это означает, что мантисса должна быть правильной дробью и иметь после запятой цифру, отличную от нуля.

Правило нормализации мантиссы: если мантисса больше единицы, то она сдвигается вправо и к порядку при каждом сдвиге прибавляется 1. Если после запятой находятся нули, то мантисса сдвигается влево, а из порядка при каждом сдвиге вычитается 1.

Запись числа «нуль» является нормализованной, если и мантисса и порядок равны нулю. Число в форме с плавающей точкой занимает в памяти ЭВМ 4 или 8 байт. При записи числа с плавающей точкой выделяются разряды для хранения знака мантиссы, знака порядка, порядка и мантиссы.

Порядок располагается так, что его самый младший двоичный разряд записывается в крайний правый бит из выделенных под порядок. Мантисса располагается так, что ее самый старший двоичный разряд записывается в крайний левый бит из выделенных под мантиссу.

Оценим диапазон представления чисел по максимальному значению:

Если для размещения порядка выделяется 7 разрядов, то

с точностью около 7 десятичных разрядов. Когда такой точности не хватает, используется формат удвоенной точности, в котором для записи мантиссы отводится дополнительная область. Это позволяет получить большее число значащих цифр в мантиссе при том же диапазоне порядков.

| следующая лекция ==>
Числа с фиксированной точкой | Арифметика нормализованных чисел

Дата добавления: 2014-01-06 ; Просмотров: 290 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Числа с плавающей запятой Floating-Point Numbers

В этом разделе описываются некоторые проблемы, с которыми часто сталкиваются разработчики при работе с числами с плавающей запятой в ADO.NET. This topic describes some of the issues that developers frequently encounter when they work with floating-point numbers in ADO.NET. Эти проблемы вызваны способом, которым эти числа хранятся в компьютерах, и не характерны для определенных поставщиков, например System.Data.SqlClient или System.Data.OracleClient. These issues are caused by the way that computers store floating-point numbers, and are not specific to a particular provider such as System.Data.SqlClient or System.Data.OracleClient.

Числа с плавающей запятой, как правило, не имеют точного двоичного представления. Floating-point numbers generally do not have an exact binary representation. Вместо этого в компьютере сохраняется приближение числа. Instead, the computer stores an approximation of the number. В разное время для представления числа может использоваться разное число двоичных цифр. At different times, different numbers of binary digits may be used to represent the number. При преобразовании числа с плавающей запятой из одного представления в другое наименее значительные цифры этого числа могут немного отличаться. When a floating point number is converted from one representation to another representation, the least significant digits of that number may vary slightly. Обычно преобразование происходит при приведении числа из одного типа в другой. Conversion typically occurs when the number is cast from one type to another type. При выполнении преобразования между типами, представляющими значения базы данных, или между типами базы данных происходит отклонение. The variation occurs whether the conversion occurs within a database, between types that represent database values, or between types. Вследствие этих изменений числа, которые логически равны, могут отличаться своими наименее значительными цифрами, что приводит к отличию между их значениями. Because of these changes, numbers that would logically be equal may have changes in their least-significant digits that cause them to have different values. Количество разрядов точности в числе может быть больше или меньше ожидаемого. The number of digits of precision in the number may be larger or smaller than expected. При форматировании в виде строки число может не отображать ожидаемое значение. When formatted as a string, the number may not show the expected value.

Для минимизации этих эффектов необходимо использовать ближайшее соответствие между доступными числовыми типами. To minimize these effects, you should use the closest match between numeric types that is available to you. Например, если вы работаете с SQL Server, точное числовое значение может измениться при преобразовании значения Transact-SQL вещественного типа в значение типа float. For example, if you are working with SQL Server, the exact numeric value may change if you convert a Transact-SQL value of real type to a value of float type. В .NET Framework преобразование Single в также Double может привести к непредвиденным результатам. In the .NET Framework, converting a Single to a Double may also produce unexpected results. В обоих случаях хорошей стратегией является обеспечение использования всеми значениями приложения одинакового числового типа. In both of these cases, a good strategy is to make all the values in the application use the same numeric type. Также можно использовать десятичный тип с фиксированной точностью или приводить числа с плавающей запятой к этому типу перед работой с ними. You can also use a fixed-precision decimal type, or cast floating-point numbers to a fixed-precision decimal type before you work with them.

Чтобы обойти проблемы со сравнением на равенство, рассмотрите использование кодирования приложения, чтобы отклонения в наименее значительных разрядах не учитывались. To work around problems with equality comparison, consider coding your application so that variations in the least significant digits are ignored. Например, вместо сравнения двух чисел — вычитать одно из другого. For example, instead of comparing to see whether two numbers are equal, subtract one number from the other number. Если разница лежит в пределах допустимого поля округлений, то приложение рассматривает числа как одинаковые. If the difference is within an acceptable margin of rounding, your application can treat the numbers as if they are the same.

Представление чисел с плавающей точкой. Операции над числами с плавающей точкой

Представление чисел с плавающей точкой — это представление числа с помощью двух других чисел: мантиссы (дробь от 0 до 0.999 . ) и порядка, или характеристики (степень числа 10, на которую надо умножить мантиссу, чтобы получить исходное число).

Например, мантисса числа 64.5 — это число 0.645, а порядок — число 2, так как 64.5 = 0.645 Ч 10 2 . Мантисса числа 0.0000012 — это число 0.12, а порядок — число -5, потому что 0.0000012 =0.12 Ч 10 -5 .

        3.4. Операции над числами с плавающей точкой

Рассмотрим два числа с плавающей точкой: а Ч 10 n и b Ч 10 m . Произведение этих чисел равно (а Ч b) Ч 10 n+m , а частное — (а/b)Ч 10 n-m

Для сложения этих чисел требуется равенство п и m. При условии n = m сумма чисел равна (а + b) Ч 10 n .

Задача. Найти сумму чисел А = 5.5 и В = -127.25

Решение. Найдем мантиссы и порядки этих чисел:


    а) А = 5.5 = 101.12 = 0.10112 Ч 2 3 => мантисса равна 0.101101, порядок равен 3

б) В = -127.25 = -1111111.012 = -0.1111111012 Ч 2 7 => мантисса равна 0.111111101, порядок равен 7. Произведем выравнивание:

В = -0.111111101Ч 2 7


Получили два числа с одинаковым порядком.

Сложим их. А и В имеют разные знаки, поэтому сложение сводится к вычитанию. Так как абсолютное значение В больше абсолютного значения А, то вычитаем А из -В, а затем меняем знак.

А : -0.000010110 порядок 7

0.111100111 порядок 7

(-В) — А = 0.111100111Ч 2 7
А + В = -((-В) — А) = 0.1111001112Ч 2 7

Проверка. А + В =-0.1111001112 2 7 = -1111001.11 = -121.75 = 5.5 + (-127.5) — верно.

В чем разница между числами с фиксированной и плавающей точкой и числовыми форматами?

Программисты, пишущие свои приложения под различные платформы на C или С++, знакомы с целыми числами и числами с плавающей запятой различной длины, но встроенные приложения могут использовать ряд числовых форматов. В данной статье мы постараемся рассмотреть эти форматы более подробно.

Одной из основных причин изучения данных форматов является понимание того, как они работают и как их правильно использовать. Например, числа с фиксированной запятой могут часто используют там, где использования чисел с плавающей запятой невозможно. Использование чисел с плавающей запятой может быть предпочтительней там, где необходимо повышенная точность.

Разработчики могут использовать числа одинарной и двоичной точности стандартных форматов IEEE 754, а как на счет чисел половинной точности (16 бит) или даже 8-битной с плавающей запятой? Последние используются в глубоких нейронных сетях (DNN), где используются малые значения. Также они могут применяться с весами нейронных сетей, в зависимости от оборудования и приложения.

Существует множество способов представления чисел. Однако макеты, как правило, меняются только по количеству задействованных битов. Использование знакового бита в двоично-кодированных значениях различается в зависимости от того, использует ли кодировка поразрядное дополнение до 1 или дополнительный код. Подход поразрядного дополнение к 1 использует ту же кодировку для целочисленной части, что означает, что на самом деле есть положительное и отрицательное нулевое значение. Дополнительный код имеет одно нулевое значение, но есть еще одно отрицательное значение, кроме положительного значения. Например, 8-разрядное целое число со знаком включает значения от -128 до -1, 0 и от 1 до 127.

Определение параметров

Типичные целочисленные форматы для микроконтроллеров и микропроцессоров включают 8-, 16-, 32-, 64- и 128-битные значения в зависимости от платформы. Многие языки программирования поддерживают разные целые числа, которые могут быть упакованы в структуры или массивы. Для периферийных интерфейсов могут также потребоваться разные значения размеров целочисленных значений. Расширение данных знаков до большего количества бит легко, поскольку все новые верхние биты равны нулю. Расширение дополнительного кода просто копирует знаковый бит в новые верхние биты. Обнаружение переполнения аналогично при уменьшении значения до меньшего числа бит.

Как отмечено, форматы с фиксированной запятой предлагают альтернативу значениям с плавающей запятой. Фиксированная запятая состоит из целочисленной и дробной частей. Количество бит, используемых для каждого, относится к определению и реализации. Фиксированная точка напрямую не поддерживается языками программирования, такими как C и C ++, хотя библиотеки для этой поддержки существуют. Программируемая логическая интегральная схема (FPGA) обычно поддерживают операции с фиксированной точкой в ​​дополнение к целым числам и числам с плавающей запятой. Поддержка плавающей запятой в FPGA часто использует в 100 раз больше шлюзов по сравнению с использованием фиксированной точки.

Целая часть значения с фиксированной точкой обычно кодируется так же, как и подписанное или целочисленное. Часть фракции обычно кодируется для представлений дополнительным кодом или кодом с основанием 10. Работа программного и аппаратного обеспечения в этом случае будет несколько разниться. Некоторые языки программирования, такие как Ada, MATLAB и LabView National Instruments, имеют встроенную поддержку значений фиксированной точкой.

Числа с плавающей запятой имеют мантиссы и экспоненты. Большинство разработчиков работают со стандартными форматами с плавающей запятой IEEE 754, которые включают три бинарных и два десятичных формата. Бинарные версии — это 32-битная одноточечная, 64-битная двойная точность и 128-битная точность. Десятичные версии включают 64-битные и 128-битные версии. Показатель представляет собой значение дополнительный код для обоих форматов. Двоичные и десятичные версии варьируются в зависимости от значения мантиссы. Десятичный стандарт поддерживает плотно упакованный десятичный код (DPD), который более эффективен, чем двоично-десятичный (BCD), который использует 4 бита для каждой десятичной цифры. BCD тратит почти 40% возможностей кодирования по сравнению с DPD.

IEEE 754 также определяет положительные и отрицательные значения бесконечности, а также NaN или «not-a-number». Другое дело о стандарте заключается в том, что он определяет не только форматы кодирования. Он также указывает, как выполняются операции, включая крайние случаи.

Биты и длина

Использование чисел с плавающей запятой, использующих менее 32 бит, является обычным явлением в ряде приложений от графики до машинного обучения. Числа с плавающей запятой меньшего формата обеспечивают расширенный диапазон данных с плавающей запятой, будучи более компактным с точки зрения хранения. Зачастую, большие форматы тратят ресурсы впустую, поскольку дополнительный диапазон или точность не будут использоваться в полной мере.

Задача использования чисел с плавающей запятой меньшего формата заключается в определении степени использования экспоненты. 8-битный «minifloat» имеет знаковый бит, четырехбитовый показатель и трехбитную мантиссу. Он поддерживает значения бесконечности и NaN. Наибольшее значение, которое может быть представлено, составляет 1,875 * 217 или 245760. Это «немного» больше, чем 128, поддерживаемое целочисленным знаком.

Данные переменной длины обычно представляют собой целые числа, которые различаются по размеру по сравнению с форматами фиксированной длины, которые уже обсуждались. Обычно размер указывается для указания количества бит, байтов или цифр, используемых полем. Арифметические операции учитывают размер значения. Преимуществом этого формата является возможность поддержки очень больших чисел, что может быть полезно во многих приложениях. Числа с плавающей запятой могут охватывать диапазон этого формата, но не с такой же точностью, поскольку они ограничены количеством бит в мантиссе.

Кодировки переменной длины могут содержать различные цифровые форматы. Наиболее эффективным является двоичный код, но BCD и даже ASCII или EBCDIC также используются, поскольку строки легко поддерживаются на большинстве языков. Плотность кодирования еще ниже, чем BCD. Однако эффективность и производительность хранилища часто компенсируются другими проблемами программирования, такими как простота использования и межплатформенный обмен данными.

Рациональное представление

Рациональные числа могут быть закодированы как отношения целочисленных значений. Целочисленные значения числителя и знаменателя могут иметь фиксированный размер или переменную длину, в зависимости от предоставленной поддержки. Числа переменной длины и рациональные числа, как правило, реализуются библиотеками. Возможно реализовать поддержку аппаратного обеспечения с использованием ПЛИС (FPGA).

Преимущество рациональных чисел над числами с плавающей запятой — способность представлять рациональные числа, такие как 1/3 без ошибок округления. Это может быть полезно во многих приложениях; рациональные числа поддерживаются на нескольких языках программирования, таких как Common Lisp, Haskell, Perl 6 и Ruby. Поддержка на других языках часто доступна с использованием библиотек, таких как стандартный класс отношений (ratio) библиотеки в C ++.

Конечно, есть компромиссы в производительности и диапазоне по сравнению с представлением фиксированной и плавающей точкой. Использование с трансцендентными функциями может создавать проблемы.

Числа с плавающей точкой

Чтобы повысить точность и максимально компактно расположить вещественное число в памяти компьютера, были придуманы числа с плавающей точкой. В старшие биты стали записывать порядок числа (см. раздел Нормализованная запись числа). Размер порядка числа известен заранее (зависит от типа данных) и занимает намного меньше места, чем могла бы занять целая часть числа.

В младшие биты стали записывать мантиссу – нормализованную экспоненциальную форму числа без запятой. Таким образом, в пределах мантиссы точка может как бы «плавать», то есть её расположение зависит от порядка числа.

Но как заставить эту точку плавать? Этим занимается процессор, то есть аппаратная часть компьютера. Во многих современных процессорах даже есть специальные команды для операций над числами с плавающей точкой (но об этом позже). В большинстве компьютеров используются именно числа с плавающей точкой (а не с фиксированной), потому что это позволяет экономить память и получать большую точность.

Вспомним алгоритм представления вещественного числа в памяти компьютера:

  1. Перевести число из Р-ичной системы в двоичную
  2. Представить двоичное число в нормализованной экспоненциальной форме
  3. Рассчитать смещённый порядок числа
  4. Разместить знак, порядок и мантиссу в соответствующие разряды

В разделе Представление вещественных чисел в памяти компьютера первый шаг мы уже сделали и получили двоичное представление целой и дробной части числа 3,14: То есть число 3,14 в двоичном виде равно: Теперь преобразуем это число в нормализованную экспоненциальную форму: Теперь рассчитаем смещённый порядок (предположим, что для хранения порядка у нас используется 5 бит). Тогда исходные данные: Записываем знак числа, порядок и мантиссу в соответствующие разряды:

Знак Порядок Мантисса
10000 0010001100

Как видите, в мантиссе у нас младшие два разряда – это нули. Эти разряды нами не используются, но при желании мы бы могли их использовать и тем самым повысить точность.

А теперь давайте спустимся с небес на землю. Все приведённые нами примеры являются упрощёнными. В реальных машинах обычно для чисел с плавающей точкой используются числа с большим количеством разрядов. Но реальные числа мы здесь рассматривать не будем, тем более что представление данных может отличаться в зависимости от процессора. Для первого знакомства информации достаточно. Возможно, что эту тему я расширю в будущих изданиях книги. А пока, если хотите знать больше – изучайте стандарт IEEE 754, который реализован во всех х86-совместимых процессорах. Ну а нам пора переходить непосредственно к Ассемблеру…

Числа с плавающей точкой

Читайте также:

  1. A. Перевод целой части числа из P-ичной системы счисления в десятичную.
  2. I Выполнение операций в АЛУ для чисел с фиксированной точкой
  3. Алгебраическое сложение чисел, представленных в форме с плавающей запятой
  4. Алгоритм представления числа с плавающей запятой.
  5. Арифметические действия над нормализованными числами
  6. Арифметические действия с двоичными числами.
  7. Арифметические операции над двоичными числами
  8. Болезни, вызванные изменениями числа аутосом.
  9. Вероятностью события А называется отношение числа исходов, благоприятных событию А, к числу всех исходов испытания.
  10. Вещественные числа
  11. Вещественные числа
  12. Выполнение арифметических операций с числами с фиксированной и плавающей запятой

Для очень больших и очень маленьких чисел неудобно и нецелесообразно выписывать много нулей в конце числа или в начале после запятой. В связи с этим и возникла экспоненциальная форма записи. (Эту форму иногда называют научной, так как именно в научных задачах часто приходится иметь дело с очень маленькими или очень большими числами.)

Длину отрезка в экспоненциальной форме записи можно представить так: 478 × 10 3 микрон; 4,78 × 10 –1 м.

Точность числа определяется не его длиной, а количеством верных значащих цифр. Задание же всех величин с точностью до 256 бит (или примерно 76 десятичных цифр) — дело не только нереальное, но и бессмысленное, хотя бы потому, что многие из этих величин получаются в результате измерений не очень точными приборами. Не случайно в практических расчетах редко используют более трех значащих цифр, соответствующим образом округляя промежуточные результаты.

Для хранения в памяти ЭВМ чисел с небольшим количеством значащих цифр целесообразно представлять их в экспоненциальной форме. В приведенном выше примере это представление может иметь вид:

4,72 × 10 5 микрон; 472 × 10 3 микрон; 4720 × 10 2 микрон;

4,72 × 10 -4 км; 47,2 × 10 -5 км; 472 × 10 -6 км.

Из этого примера видно, что положение запятой в записи числа может изменяться. Поэтому представление в ЭВМ числа в экспоненциальной форме называетсяпредставлением с плавающей точкой (запятой). Кроме того, экспоненциальную форму называют еще полулогарифмической или нормальной.

Любое число А в экспоненциальной форме представляется в виде

А = mA × q p ,

где mA мантисса числа; q — основание системы счисления, р —порядок числа.

Для однозначности представления чисел с плавающей точкой используется нормализованная форма, при которой мантисса отвечает условию:

Это означает, что мантисса должна быть правильной дробью и иметь после запятой цифру, отличную от нуля.

Правило нормализации мантиссы: если мантисса больше единицы, то она сдвигается вправо и к порядку при каждом сдвиге прибавляется 1. Если после запятой находятся нули, то мантисса сдвигается влево, а из порядка при каждом сдвиге вычитается 1.

Запись числа «нуль» является нормализованной, если и мантисса и порядок равны нулю. Число в форме с плавающей точкой занимает в памяти ЭВМ 4 или 8 байт. При записи числа с плавающей точкой выделяются разряды для хранения знака мантиссы, знака порядка, порядка и мантиссы.

Порядок располагается так, что его самый младший двоичный разряд записывается в крайний правый бит из выделенных под порядок. Мантисса располагается так, что ее самый старший двоичный разряд записывается в крайний левый бит из выделенных под мантиссу.

Оценим диапазон представления чисел по максимальному значению:

Если для размещения порядка выделяется 7 разрядов, то

с точностью около 7 десятичных разрядов. Когда такой точности не хватает, используется формат удвоенной точности, в котором для записи мантиссы отводится дополнительная область. Это позволяет получить большее число значащих цифр в мантиссе при том же диапазоне порядков.

| следующая лекция ==>
Числа с фиксированной точкой | Арифметика нормализованных чисел

Дата добавления: 2014-01-06 ; Просмотров: 291 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Илон Маск рекомендует:  Шаблон сайта турагенство HTML, CSS, 1 страница
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL