7359 байт добавлено
, 1 год назад
'''Число́ полови́нной то́чности''' ({{lang-en|half precision}}) — [[компьютер]]ный формат представления чисел, занимающий в памяти половину компьютерного слова (в случае 32-битного компьютера — 16 бит или 2 байта). Диапазон значений ± 2<sup>−24</sup>(5.96E-8) — 65504. Приблизительная точность — 3 знака (10 двоичных знаков, log<sub>10</sub>(2<sup>11</sup>)).
{|class="wikitable" style="border-collapse: collapse; border: none"
|-
!colspan=5 style="background-color: powderblue; border: thin solid black; border-bottom: none"|Знак
|-
!style="background-color: powderblue; border: thin solid black; border-top: none"|
!colspan=5 style="background-color: lightgreen; border: thin solid black"|Экспо-<br />нента
!colspan=10 style="background-color: lightcoral; border: thin solid black"|Мантисса
|-style="text-align: right"
!style="background-color: powderblue; border: thin solid black"|0
!style="background-color: lightgreen; border: thin solid black"|0
!style="background-color: lightgreen; border: thin solid black"|0
!style="background-color: lightgreen; border: thin solid black"|0
!style="background-color: lightgreen; border: thin solid black"|0
!style="background-color: lightgreen; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
<!-- 8 бит -->
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
|-
|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|15
|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|8
|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|7
|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|0
|}
=== Кодирование поля Exponent ===
Числа ''half-precision binary floating-point'' кодируют поле ''Exponent'' с использованием сдвига (''bias'') на 15.
* E<sub>min</sub> = 00001<sub>2</sub> − 01111<sub>2</sub> = −14
* E<sub>max</sub> = 11110<sub>2</sub> − 01111<sub>2</sub> = 15
* Exponent bias = 01111<sub>2</sub> = 15
Другими словами, для получения настоящего порядка (для Exponent от 00001<sub>2</sub> до 11110<sub>2</sub>)
надо из закодированного поля Exponent вычесть 15 (т.е. 01111<sub>2</sub>).
С помощью значений 00000<sub>2</sub> и 11111<sub>2</sub>
поля Exponent кодируют специальные случаи.
{|class="wikitable" style="text-align:center"
! Exponent !! Significand zero !! Significand non-zero !! Equation
|-
| 00000<sub>2</sub> || [[+0]] , [[−0]] || число ''subnormal'' || (−1)<sup>signbit</sup> × 2<sup>−14</sup> × 0.significantbits<sub>2</sub>
|-
| 00001<sub>2</sub>, ..., 11110<sub>2</sub> ||colspan=2| число ''normalized'' || (−1)<sup>signbit</sup> × 2<sup>exponent−15</sup> × 1.significantbits<sub>2</sub>
|-
| 11111<sub>2</sub> || ±infinity || [[NaN]] (quiet, signalling)
|}
Минимальное точное (''subnormal'') положительное значение =
2<sup>−24</sup> ≈ 5.96 × 10<sup>−8</sup>.
Минимальное (''normal'') положительное значение = 2<sup>−14</sup> ≈ 6.10 × 10<sup>−5</sup>.
Максимальное представляемое значение = (2−2<sup>−10</sup>) × 2<sup>15</sup> = 65504.
== Примеры чисел половинной точности ==
В данных примерах числа с плавающей запятой представлены в двоичном представлении. Они включают в себя бит знака, экспоненту и мантиссу.
0 01111 0000000000 = +1 * 2<sup>15-15</sup> = 1
0 01111 0000000001 = +1.0000000001<sub>2</sub> * 2<sup>15-15</sup>=1 + 2<sup>-10</sup> = 1.0009765625 (следующее большее число после 1)
1 10000 0000000000 = -1 * 2<sup>16-15</sup> = −2
0 11110 1111111111 = 65504 <!-- (max half precision) -->
0 00001 0000000000 = 2<sup>−14</sup> ≈ 6.10352 × 10<sup>−5</sup> (Минимальное нормальное положительное число)
0 00000 1111111111 = 2<sup>-14</sup> - 2<sup>-24</sup> ≈ 6.09756 × 10<sup>−5</sup> (Максимальное [[Денормализованные числа|денормализованное]])
0 00000 0000000001 = 2<sup>−24</sup> ≈ 5.96046 × 10<sup>−8</sup> (Минимальное положительное денормализованное)
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 округляется вниз.
== Пример пересчета на языке python ==
<syntaxhighlight lang="python3">
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
</syntaxhighlight>
== Пределы точности на целых числах ==
Целые между 0 и 2047 представляются точно<br />
Целые между 2048 и 4095 округляются вниз до ближайшего кратному 2 (четному числу)<br />
Целые между 4096 и 8191 округляются вниз до ближайшего кратному 4<br />
Целые между 8192 и 16383 округляются вниз до ближайшего кратному 8<br />
Целые между 16384 и 32767 округляются вниз до ближайшего кратному 16<br />
Целые между 32768 и 65535 округляются вниз до ближайшего кратному 32
== См. также ==
* [[Числа с плавающей запятой]]
* [[Число одинарной точности]]
* [[Число двойной точности]]
* [[Число четверной точности]]
* {{нп3|bfloat16|Формат bfloat16|en|bfloat16 floating-point format}} (альтернативный 16-битный формат, имеет низкую точность, но легко преобразуется из чисел одинарной точности)
{{перевести|en|Half-precision floating-point format}}
{{нет ссылок|дата=11 декабря 2021}}