Меню
Главная
Случайная статья
Настройки
|
Число одинарной точности (англ. single precision, single) — широко распространенный компьютерный формат представления вещественных чисел, занимающий в памяти 32 бита (4 байта). Как правило, под ним понимают формат числа с плавающей запятой стандарта IEEE 754.
Числа одинарной точности с плавающей запятой эквивалентны по точности числу с 7-8 значащими десятичными цифрами (в среднем 7,6) в диапазоне от до примерно .
В современных компьютерах вычисления с числами с плавающей запятой поддерживаются аппаратным сопроцессором (FPU — англ. floating point unit). Однако в ряде вычислительных архитектур нет аппаратной поддержки чисел с плавающей запятой, и тогда работа с ними осуществляется программно.
Знак
|
|
Порядок
|
Мантисса
|
0
|
0
|
1
|
1
|
1
|
1
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
= 0,15625
|
31
|
24
|
23
|
16
|
15
|
8
|
7
|
0
|
Для вычисления показателя степени из восьмиразрядного поля порядка вычитается смещение порядка, равное 12710 = 7F16 = 011111112 (то есть, 011111002 — 011111112 = 12410 — 12710 = 310). Так как в нормализованной двоичной мантиссе целая часть всегда равна единице, то в поле мантиссы записывается только её дробная часть, то есть фактический размер мантиссы числа с одинарной точностью составляет 24 бита. Для вычисления мантиссы к единице добавляется дробная часть мантиссы из 23-разрядного поля дробной части мантиссы 1,010000000000000000000002. Число равно произведению мантиссы со знаком на двойку в степени порядка = 1,012*210310 = 1012*210510 = 510*210510 = 0,1562510.
Содержание
Специальные значения
Стандарт IEEE 754 определяет ряд значений с особой интерпретацией или математическими свойствами.
Порядок |
Мантисса = 0 |
Мантисса 0 |
Значение
|
0x00 |
±ноль |
Денормализованные числа |
|
0x01 ... 0xFE |
|
|
|
0xFF |
±Inf |
qNaN, sNaN |
|
Значения Inf появляются если результат расчета столь велик что не помещается в одинарный формат IEEE 754, например происходит арифметическое переполнение. Вычисления или сравнения с Inf оговариваются особым образом.
Значения NaN появляются если результат расчета не определен. Например деление ноля на ноль. Вычисления с хотя бы одним NaN дают NaN, сравнения с NaN всегда false. Иногда различают signaling NaN (sNaN) и quiet NaN (qNaN), различающиеся кодированием мантиссы. sNaN обозначает требование генерации исключения в вычислительной системе, а qNaN не прерывает вычислений.
Общий шаблон для побитового доступаunion {
float fl;
uint32_t dw;
} f;
int s = ( f.dw >> 31 ) ? -1 : 1; /* Знак */
int e = ( f.dw >> 23 ) & 0xFF; /* Порядок */
int m = /* Мантисса */
e ?
( f.dw & 0x7FFFFF ) | 0x800000 :
( f.dw & 0x7FFFFF ) << 1;
Результирующая формула расчёта (число одинарной точности) будет s * (m * 2 ^ -23) * (2 ^(e-127)) .
Примеры использования
Конвертирует целочисленное представление числа с одинарной точностью (в виде четырёх байт, младшие в начале) во встроенный тип действительных чисел Python’а.
def dw2float(dw_array):
assert (len(dw_array) == 4)
dw = int.from_bytes(dw_array, byteorder='little',signed=False)
s = -1 if (dw >> 31) == 1 \
else 1 # Знак
e = ( dw >> 23 ) & 0xFF; # Порядок
m = ((dw & 0x7FFFFF ) | 0x800000) if e != 0 \
else ((dw & 0x7FFFFF ) << 1) # Мантисса
m1 = m*(2**(-23)) # Мантисса в float
return s*m1*(2**(e-127))
0.1562510 в формате float записывается как 3E200000 16, что эквивалентно четырём байтам: [0x00,0x00,0x20,0x3E]. Вывод программы:
In[1]: dw2float([0x00,0x00,0x20,0x3E])
Out[1]: 0.15625
In[2]: dw2float([0x00,0x00,0x20,0xBE])
Out[2]: -0.15625
Примеры чисел одинарной точности
Эти примеры представлены в шестнадцатеричном виде чисел с плавающей запятой. Они включают знаковый бит, порядок и мантиссу.
3f80 0000 = 1
c000 0000 = 2
7f7f ffff 3.40282346639 1038 (максимальное одинарной точности)
0000 0001 = 2149 1.40129846432 1045 (Минимальное положительное число одинарной точности — денормализованное)
0080 0000 = 2126 1.17549435082 1038 (Минимальное нормализованное положительное число одинарной точности)
0000 0000 = 0
8000 0000 = 0
7f80 0000 = infinity
ff80 0000 = infinity
3eaa aaab 1/3
Обычно при переводе числовых констант в формат float делается округление. Например, число 1/3 округляется вверх.
См. также
Ссылки
|
|