Его относительно легко узнать:
Десятичный или двоичный код;
myfloat a = 2.0,
b = 0.0;
for (int i=0; i<20; i++)
b += 0.1;
(a == b) => decimal, else binary
Причина: все двоичные системы могут представлять 2.0, но любая двоичная система будет иметь
срок ошибки для представления 0,1. Накапливая, вы можете быть уверены, что эта ошибка не исчезнет, как при округлении: например, 1,0 == 3,0 * (1,0 / 3,0) даже в двоичных системах
Длина мантиссы:
Myfloat a = 1.0,
b = 1.0,
c,
inc = 1.0;
int mantissabits = 0;
do {
mantissabits++;
inc *= 0.5; // effectively shift to the right
c = b+inc;
} while (a != c);
Вы добавляете убывающие условия, пока не достигнете способности мантиссы. Он возвращает 24 бита для числа с плавающей запятой и 53 бита для двойного числа, что является правильным (сама мантисса содержит только 23/52 бита, но поскольку первый бит всегда равен единице для нормализованных значений, у вас есть скрытый дополнительный бит).
Длина экспоненты:
Myfloat a = 1.0;
int max = 0,
min = 0;
while (true) {
a *= 2.0;
if (a != NaN && a != Infinity && whatever) // depends on system
max++;
else
break;
}
a = 1.0;
while (true) {
a *= 0.5;
if (a != 0.0)
min--;
else
break;
}
Вы сдвигаете 1,0 влево или вправо, пока не достигнете вершины или низа.
Обычно диапазон опыта составляет -(max+1) - max
.
Если min
меньше, чем -(max+1)
, у вас есть (как у чисел с плавающей точкой, так и у двойных) субнормалы.
Обычно положительные и отрицательные значения симметричны (возможно, с одним смещением), но вы можете настроить тест, добавив отрицательные значения.