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

Последнее обновление: 02.07.2023

Числа с плавающей точкой или floating-point numbers представляют запись вещественных чисел, в которой число хранится в виде мантиссы и порядка (показателя степени), например,

1.12345 x 102

Для определения чисел с плавающей точкой процессоры x86-64 используют стандарт IEEE 754, согласно которому каждое число содержит ряд компонентов:

  • бит знака, который указывает, является ли число положительным или отрицательным

  • мантисса, в примере выше 1.12345

  • экспонента или показатель степени, в примере 102 это числа 2.

Также числа с плавающей точкой характеризуются таким показателем, как десятичные знаки (decimal digits) или еще называют "десятичная точность" (decimal precision). Этот показатель указывает, сколько десятичных знаков может хранить число. Например, в числе 123.45 десятичная точность равна 5 (5 цифр).

Ассемблере на архитектуре x86-64 есть три встроенных типа для работы с числами с плавающей точкой: real4 (одинарной точности), real8 (двойной точности) и real10 (расширенной точности)

Тип

Размер

Бит знака

Дробная часть

Экспонента

real4

32 бита

1

23

8

real8

64 бита

1

52

11

real10

80 бит

1

64

15

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

Формат типа real4 - чисел с плавающей точкой с одинарной точностью использует 23-битную мантисса с дополнением до единицы, 8-битную экспоненту и бит с одним знаком.

Float в ассемблере Intel

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

1.mmmmmmm mmmmmmmm

где mmmmmmm mmmmmmmm - это 23 бита мантисы. Эти 23 бита представляют беззнаковое число, которые идут после десятичной точкой. То есть мантиса обычно представляет значение от 1,0 до чуть меньше 2,0.

Для представления значений вне диапазона от 1,0 до 2,0 применяется экспонента. Формат с плавающей точкой возводит 2 в степень, указанную экспонентой, а затем умножает мантиссу на это значение. Показатель степени составляет 8 бит и хранится в формате "excess-127". В этом формате экспонента 0 представляет значение 127 (7Fh), отрицательные показатели представляют собой значения в диапазоне от 0 до 126, а положительные показатели — значения в диапазоне от 128 до 255. Для преобразования экспоненты в формат "excess-127", к значению экспоненты добавляется число 127.

С 24-битной мантиссой можно получить примерно шесть с половиной (десятичных) знаков точности (половина означает, что все первые шесть цифр могут быть в диапазоне от 0 до 9, а седьмая цифра может быть только в диапазоне от 0 до n, где n < 9 и обычно близко к 5). Благодаря этому можно представлить 2±127 значений или примерно 10±38.

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

Числа с плавающей точкой двойной точности - данные типа real8 занимают 64 бита. Первый бит числа также представляет знаковый бит. Однако теперь мантисса занимает 52 бита плюс 1 подразумеваемый бит - старший бит, равный 1. А экспонента занимает 11 бит и использует формат "excess-1023". Это обеспечивает диапазон значений 10±308 и 14,5 знаков точности

Числа расширенной точности

Числа real10 - числа расширенной точности занимают 80 бит. Первый бит числа также представляет знаковый бит. Мантисса занимает 64 бита (в отличие от чисел одинарной и двойной точности подразумеваемый бит отсутствует). А экспонента занимает 15 бит и использует формат "excess-16383". Это обеспечивает диапазон значений 10±308

В архитектуре x86-64 FPU все вычисления выполняются с использованием формата расширенной точности. Всякий раз, когда загружаются значения с одинарной или двойной точностью, FPU автоматически преобразует их в значения расширенной точности. А когда значения с одинарной или двойной точностью сохраняются, FPU автоматически округляет значения до соответствующего размера перед сохранением.

Нечисловые значения

Стандарт IEEE для чисел с плавающей токой распознает три специальных нечисловых значения: -infinity (минус бесконечность), +infinity (плюс бесконечность) и NaN (не число). Для каждого из этих специальных чисел поле экспоненты заполняется всеми битами 1. Если в экспоненте все биты 1, а в мантиссе все биты 0, то значение равно бесконечности. Бит знака будет равен 0 для +infinity и 1 для -infinity. Если в экспоненте все биты 1, а в мантиссе не все биты 0, то значение представляет NaN.

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

В MASM число с плавающей точкой должно начинаться с десятичной цифры, за которой может следовать точка как разделитель целой и дробной частей и некоторое количество десятичных цифр. Если число отрицательное, то перед ним указывается минус (для положительных можно указать знак +, но он необязателен). Например:

1.234  -23.456 0.23 -1.0 

Если в целой части только 0, то его можно опустить

.23 (или 0.23)  .01567 (или 0.01567)

Также можно использовать экспоненциальную запись, при которой после числа следует буква e или E, за которой может следовать знак (+ или -) и одна или несколько десятичных цифр.

3.75e2 1.1e-1 1.e+4 -123.456e+789 +25.0e0 1.e3

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

.data
n1 real4 ?
n2 real4 2.7
n3 real4 3.14159
n4 real8 ?
n5 real8 1.234567e+10
n6 real10 ?
n7 real10 -1.0e-10

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

option casemap:none

.data
n real8 4.6

.code
main proc
    movsd xmm0, n   ; в регистр XMM0 помещаем переменную n
    ret
main endp
end

Здесь применяется инструкция movsd, которая загружает 64-битную переменную в один из регистров XMM.

Нормализованные значения

Для максимальной точности в большинстве вычислений используются нормализованные значения. Нормализованное значение с плавающей точкой — это значение, в котором старший бит мантиссы содержит 1. Почти любое ненормализованное значение можно нормализовать. Для этого бит мантиссы сдвигается влево и уменьшается показатель степени до тех пор, пока в старшем бите мантиссы не появится 1. Но следует помнить, что экспонента — это двоичная экспонента: когда показатель степени увеличивается на 1, число с плавающей точкой умножается на 2, и наоборот, при уменьшении показателя степени на 1, значение с плавающей точкой делится на 2. Также сдвиг мантиссы на один бит влево умножает значение с плавающей точкой на 2; аналогичным образом сдвиг мантиссы вправо делит значение с плавающей точкой на 2. Следовательно, сдвиг мантиссы влево на один разряд и одновременное уменьшение показателя степени на 1 вообще не меняет значение числа с плавающей точкой. Поддержание чисел с плавающей точкой в нормализованном виде полезно, так как при этом сохраняется максимальное количество битов точности для вычислений.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850