Число двойной точности
- 1 year ago
- 0
- 0
Число́ полови́нной то́чности ( англ. half precision ) — компьютерный формат представления чисел, занимающий в памяти половину компьютерного слова (в случае 32-битного компьютера — 16 бит или 2 байта). Диапазон значений ± 2 −24 (5.96E-8) — 65504. Приблизительная точность — 3 знака (10 двоичных знаков, log 10 (2 11 )).
Знак | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Экспо-
нента |
Мантисса | ||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
15 | 8 | 7 | 0 |
Числа half-precision binary floating-point кодируют поле Exponent с использованием сдвига ( bias ) на 15.
Другими словами, для получения настоящего порядка (для Exponent от 00001 2 до 11110 2 ) надо из закодированного поля Exponent вычесть 15 (т.е. 01111 2 ).
С помощью значений 00000 2 и 11111 2 поля Exponent кодируют специальные случаи.
Exponent | Significand zero | Significand non-zero | Equation |
---|---|---|---|
00000 2 | +0 , −0 | число subnormal | (−1) signbit × 2 −14 × 0.significantbits 2 |
00001 2 , ..., 11110 2 | число normalized | (−1) signbit × 2 exponent−15 × 1.significantbits 2 | |
11111 2 | ±infinity | NaN (quiet, signalling) |
Минимальное точное ( subnormal ) положительное значение = 2 −24 ≈ 5.96 × 10 −8 .
Минимальное ( normal ) положительное значение = 2 −14 ≈ 6.10 × 10 −5 .
Максимальное представляемое значение = (2−2 −10 ) × 2 15 = 65504.
В данных примерах числа с плавающей запятой представлены в двоичном представлении. Они включают в себя бит знака, экспоненту и мантиссу.
0 01111 0000000000 = +1 * 215-15 = 1 0 01111 0000000001 = +1.00000000012 * 215-15=1 + 2-10 = 1.0009765625 (следующее большее число после 1) 1 10000 0000000000 = -1 * 216-15 = −2 0 11110 1111111111 = 65504 0 00001 0000000000 = 2−14 ≈ 6.10352 × 10−5 (Минимальное нормальное положительное число) 0 00000 1111111111 = 2-14 - 2-24 ≈ 6.09756 × 10−5 (Максимальное денормализованное) 0 00000 0000000001 = 2−24 ≈ 5.96046 × 10−8 (Минимальное положительное денормализованное) 0 00000 0000000000 = 0 1 00000 0000000000 = −0 0 11111 0000000000 = infinity 1 11111 0000000000 = −infinity 0 01101 0101010101 ≈ 0.33325... ≈ 1/3
По умолчанию, 1/3 округляется вниз.
data = 31743 #0 11110 1111111111
sign = data >> 15
mantissa = (data & 0x3FF)
degree = (data >> 10) & 0x1F
result = ((-1) ** sign) * (2 ** (degree-15)) * (1 + mantissa/2**10)
print(result)
#результат выполнения программы 65504
Целые между 0 и 2047 представляются точно
Целые между 2048 и 4095 округляются вниз до ближайшего кратному 2 (четному числу)
Целые между 4096 и 8191 округляются вниз до ближайшего кратному 4
Целые между 8192 и 16383 округляются вниз до ближайшего кратному 8
Целые между 16384 и 32767 округляются вниз до ближайшего кратному 16
Целые между 32768 и 65535 округляются вниз до ближайшего кратному 32
|
В другом языковом разделе
есть более полная статья
(англ.)
.
|
|
В статье
не хватает
ссылок на источники
(см.
рекомендации по поиску
).
|