Показаны сообщения с ярлыком IEEE754. Показать все сообщения
Показаны сообщения с ярлыком IEEE754. Показать все сообщения

среда, 23 июля 2014 г.

Типы данных с плавающей точкой. Часть 2

По рекомендациям, заложенным в стандарт IEEE754 можно сконструировать дополнительные типы данных, часть из которых находит применение - fp24 (3 байта), fp16 (два байта), fp8 (один байт).

FP24 (s16e7)

бит знака, 7 бит порядка (смещение 63), 17 бит мантиссы (представляется 16 битами, 17 бит равен 1 для нормализованных и 0 для денормализованных чисел).

Emax = 63,  263 ≈ 9.223 1018Emin = -62,  2-62 ≈ 2.168 10-19
Макс. нормализованное число ≈ 1.845 1019 (1.11111...111 = 2 - 2-16 ≈ 2)
Мин. нормализованное число ≈ 2.168 10-19 (1.00000...000 * 2-62)
Макс. денормализовнное число ≈ 2.168 10-19 (0.1111...111 * 2-62 - для E=0 e = Emin = -62)
Мин. денормализованное число 2-74 ≈ 5.294 10-23 (0.0000..001 * 2-62 = 2-16 * 2-62)
Точность вычислений - 5 знаков ( log10(217) ≈ 5.118)


FP16 (s10e5)

бит знака, 5 бит порядка (смещение 15), 11 бит мантиссы (представляется 10 битами, 11 бит равен 1 для нормализованных и 0 для денормализованных чисел).

Emax = 15,  215 = 32768,  Emin -14,  2-14 = 6.103 10-5

Макс. нормализованное число = 65504 (1.11111...111 = 2 - 2-10)
Мин. нормализованное число = 6.103515625 * 10-5 (1.00000...000 * 2-14)
Макс. денормализовнное число ≈ 6.098 10-5 (0.1111...111 * 2-14 - для E=0 e = Emin = -14)
Мин. денормализованное число 2-24 ≈ 5.96 10-8
Точность вычислений - 3 знака ( log10(215) ≈ 3.311)


FP8 (s3e4, minifloat)

бит знака, 4 бита порядка (смещение 7), 4 бита мантиссы (представляется 3 битами, равен 1 для нормализованных и 0 для денормализованных чисел).


Emax 27 = 128, Emin 2-6 = 0.015625
Макс. нормализованное число 27 * 1.111 = 240
Мин. нормализованное число 2-6 * 1.000 = 0.015625
Макс. денормализовнное число 2-6 * 0.111 = 0.013671875
Мин. денормализованное число 2-6 * 0.001 = 0,001953125
Точность вычислений - 1 знак ( log10(24) ≈ 1.204)

вторник, 22 июля 2014 г.

Типы данных с плавающей точкой. Часть 1

Официально поддерживаемыми в Си являются следующие типы данных с плавающей точкой:

float (точность - 32 бит, sizeof(float) = 4)
double (точность - 64 бит, sizeof(double) = 8)
и плохо поддерживаемый long double (точность - 80 бит, sizeof(long dobule) = 12).


float (или single

бит знака, 8 бит порядка (со смещением 127), 24 бита мантиссы (представляется 23 битами, 24 подразумевается равным 1 для нормализованных чисел и 0 для денормализованных).

Emax = 127,  2127 ≈ 1.7 1038, Emin = -126,  2-126 ≈ 1.17 10-38.
Макс. нормализованное число ≈ 3.4 1038 (1.11111...111 = 2 - 2-23 ≈ 2)
Мин. нормализованное число ≈ 1.17 10-38 (1.00000...000 * 2-126)  
Макс. денормализованное число ≈ 1.17 10-38 (0.1111...111 * 2-126 - для E=0 e = Emin - -126)
Мин. денормализованное число  2-149 ≈ 1.4 10-45 (0.0000..001 * 2-126 = 2-23 * 2-126)
Точность вычислений - 7 знаков ( log10(224) ≈ 7.225)


double

бит знака, 11 бит порядка (со смещенем 1023), 53 бита мантиссы (представляется 52 битами, подразумевается 1 для нормализованных и 0 для денормализованных чисел).

Emax = 1023,  21023 ≈ 8.988 10307Emin = -1022,  2-1022 ≈ 2.225 10-308.
Макс. нормализованное число ≈ 1.798 10308 (1.11111...111 = 2 - 2-52 ≈ 2)
Мин. нормализованное число ≈ 2.225 10-308 (1.00000...000 * 2-1022)  
Макс. денормализованное число ≈ 2.225 10-308 (0.1111...111 * 2-1022 - для E = 0 e = Emin - -1022)
Мин. денормализованное число  2-1074 ≈ 4.940 10-324 (0.000...001 * 2-1022 = 2-52 * 2-1022)
Точность вычислений - 15 знаков ( log10(253) ≈ 15.954)

extended

бит знака, 15 бит порядка (со смещенем 16383), 64 бита мантиссы (представляется всеми 64 битами, первый бит равен 1 для нормализованных и 0 для денормализованных чисел).

 Emax = 16383,  216383 ≈ 5.949 104931Emin = -16382,  2-16382 ≈ 3.362 10-4932.
Макс. нормализованное число ≈ 1.190 104932 (1.11111...111 = 2 - 2-63 ≈ 2)
Мин. нормализованное число ≈ 3.362 10-4932 (1.00000...000 * 2-16382)  
Макс. денормализованное число ≈ 3.362 10-4932 (0.1111...111 * 2-16382 - для E = 0 e = Emin - -16382)
Мин. денормализованное число  2-16445 ≈ 3.645 10-4951 (0.000...001 * 2-16382 = 2-63 * 2-16382)
Точность вычислений - 19 знаков ( log10(264) ≈ 19.266)

четверг, 17 июля 2014 г.

Вещественные числа в формате IEEE-754

Любое вещественное число с плавающей точкой можно представить в формате

(-1)s basee mantiss

где s - знак (0 - положительный, 1 - отрицательный);
       base - основание (система счисления, в которой представляется число, чаще всего 2 или 10);
       e - экспонента (порядок, показатель степени).
       mantiss - мантисса.

Мантисса нормализуется так, чтобы представлять собой число с плавающей точкой для которого выполняется условие: 1 <= m < b.


Для десятичной системы счисления первый разряд мантиссы находится в диапазоне от 1 до 9, для двоичного, соответственно, только 1, поэтому его можно всегда опускать, тем самым увеличивая разрядность мантиссы на 1:

123.45610 = 1.23456 * 102
0.12345610 = 1.23456 * 10-2
11101.012 = 1.110101 * 24 - для мантиссы достаточно 6 бит, т.к. первый всегда равен 1.
0.0011101012 = 1.110101 * 2-3

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


Реальная точность мантиссы - n+1 бит. 

Экспонента представляется в смещенном виде. Величина смещения рассчитывается по формуле offset = 2b-1 - 1. Для b = 8 бит (single) offset = 127, для b = 11 бит (double) offset = 1023.

Значения, состоящие из одних нулей (E = 0) и одних единиц (E = 2b-1) зарезервированы для специальных применений.
Максимальная возможная экспонента Emax представима как 2b-1 и равняется offset.
Минимальная возможная экспонента Emin представима как 1 и равняется -(offset - 1).

Emin для 8 бит = -126, для 11 бит = -1022, Emax для 8 бит = 127, для 11 бит = 1023.

Специальные случаи:

E = 0 (одни нули), M = 0 (одни нули), S = 0: положительный 0 (+0).
E = 0 (одни нули), M = 0 (одни нули), S = 1: отрицательный 0 (-0).

E = 0 (одни нули), M = любое значение (кроме одних нулей, чтобы не путать с положительным и отрицательным нулями), S = любое значение: денормализованные числа.

E = 2b-1 (одни единицы), M = 0 (одни нули), S = 0 представляет собой
E = 2b-1 (одни единицы), M = 0 (одни нули), S = 1 представляет собой -∞

E = 2b-1 (одни единицы), M = 1xx...xxx (первый знак - 1), S - любое: quiet NaN (qNaN)
E = 2b-1 (одни единицы), M = 0xx...xxx (первый знак - 0, остальные - хотя бы одна единица, чтобы не совпало с ), S - любое: signalling NaN (sNaN)