Длинные двойные субнормалы / денормалы усекаются до 0 [-Woverflow]
В IEEE754
Стандартно, минимальное строго положительное (субнормальное) значение составляет 2 -16493 ≈ 10 -4965 с использованием формата с плавающей запятой с четверной точностью. Почему GCC отклоняет что-либо ниже 10 -4949? Я ищу объяснения различных вещей, которые могут происходить внизу, которые определяют предел 10 -4949, а не 10 -4965.
#include <stdio.h>
void prt_ldbl(long double decker) {
unsigned char * desmond = (unsigned char *) & decker;
int i;
for (i = 0; i < sizeof (decker); i++) {
printf ("%02X ", desmond[i]);
}
printf ("\n");
}
int main()
{
long double x = 1e-4955L;
prt_ldbl(x);
}
Я использую GNU GCC версии 4.8.1 онлайн - не уверен, на какой архитектуре он работает (я понимаю, что это может быть причиной). Пожалуйста, не стесняйтесь размещать свои выводы из разных архитектур.
2 ответа
Ваш long double
тип не может быть (*) четверной точности. Это может быть просто 387-битный расширенный двойной формат. Этот формат имеет то же число битов для показателя степени, что и квадрацистическая точность, но гораздо меньше значащих битов и битов, поэтому минимальное значение, которое будет представлено в нем, звучит примерно так (2-16445)
(*) Ваш long double
скорее всего, не будет четырехточечной, потому что ни один процессор не реализует аппаратную четкость. Компилятор всегда может реализовать в программном обеспечении четверную точность, но он с большей вероятностью отобразит long double
с двойной точностью, с расширенной-двойной или двойной-двойной.
Самый маленький 80-битный long double
составляет около 2-16382 - 63 ~ = 10-4951, а не 2-164934. Так что компилятор полностью корректен; ваш номер меньше, чем самый маленький субнормальный.