Число одинарной точности: различия между версиями
[непроверенная версия] | [непроверенная версия] |
уточнение |
ytdthysq rjl |
||
Строка 62: | Строка 62: | ||
== Общий шаблон для побитового доступа == |
== Общий шаблон для побитового доступа == |
||
<source lang="c"> |
<source lang="c" line="1"> |
||
union { |
union { |
||
float fl; |
float fl; |
||
uint32_t dw; |
uint32_t dw; |
||
} f; |
} f; |
||
int s = ( f.dw >> 31 ) ? -1 : 1; /* Знак */ |
int s = ( f.dw >> 31 ) ? -1 : 1; /* Знак */ |
||
int e = ( f.dw >> 23 ) & 0xFF; /* Порядок */ |
int e = ( f.dw >> 23 ) & 0xFF; /* Порядок */ |
||
int m = |
int m = ( f.dw & 0x3FFFFF ); /* Мантисса */ |
||
e ? |
|||
( f.dw & 0x7FFFFF ) | 0x800000 : |
|||
( f.dw & 0x7FFFFF ) << 1; |
|||
</source> |
</source> |
||
Результирующая формула расчёта (число одинарной точности) будет <code>s * (m * 2 ^ -23) * (2 ^(e-127))</code>. |
Результирующая формула расчёта (число одинарной точности) будет <code>s * (m * 2 ^ -23) * (2 ^(e-127))</code>. |
Версия от 21:39, 15 августа 2020
Число́ одина́рной то́чности (англ. 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*210-310 = 1012*210-510 = 510*210-510 = 0,1562510.
Общий шаблон для побитового доступа
union {
float fl;
uint32_t dw;
} f;
int s = ( f.dw >> 31 ) ? -1 : 1; /* Знак */
int e = ( f.dw >> 23 ) & 0xFF; /* Порядок */
int m = ( f.dw & 0x3FFFFF ); /* Мантисса */
Результирующая формула расчёта (число одинарной точности) будет s * (m * 2 ^ -23) * (2 ^(e-127))
.
Примеры использования
Python
Конвертирует целочисленное представление числа с одинарной точностью (в виде четырёх байт, младшие в начале) во встроенный тип действительных чисел 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.4028234 × 1038 (максимальное одинарной точности) 0000 0001 = 2-149 ≈ 1.401298464 × 10−45 (Минимальное положительное число одинарной точности — денормализованное) 0080 0000 = 2-126 ≈ 1.175494351 × 10−38 (Минимальное нормализованное положительное число одинарной точности) 0000 0000 = 0 8000 0000 = −0 7f80 0000 = infinity ff80 0000 = −infinity 3eaa aaab ≈ 1/3
По умолчанию, 1/3 округляется вверх, в отличие от чисел двойной точности.
См. также
- Числа с плавающей запятой
- Число половинной точности
- Число двойной точности
- Число четверной точности
- Число восьмерной точности
- Формат bfloat16[англ.] (альтернативный 16-битный формат, имеет низкую точность, но легко преобразуется из чисел одинарной точности)
Ссылки
- Онлайн IEEE754 калькулятор
- Онлайн преобразователь для IEEE 754 чисел с одинарной точностью
- Habrahabr. Что нужно знать про арифметику с плавающей запятой
В статье не хватает ссылок на источники (см. рекомендации по поиску). |
Для улучшения этой статьи желательно:
|