Длинные двойные субнормалы / денормалы усекаются до 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. Так что компилятор полностью корректен; ваш номер меньше, чем самый маленький субнормальный.

Другие вопросы по тегам