long double subnormals / denormals被截断为0 [-Woverflow]

时间:2014-09-18 15:03:46

标签: gcc floating-point c99 ieee-754 quadruple-precision

IEEE754标准中,使用四倍精度浮点格式,最小严格正(次正规)值为2 -16493 ≈10 -4965 。为什么海湾合作委员会拒绝任何低于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 version 4.8.1 online - 不确定它正在运行哪个架构(我意识到可能是罪魁祸首)。请随意发布不同架构的发现。

2 个答案:

答案 0 :(得分:2)

您的long double类型可能不是(*)四倍精度。它可能只是387 80-bit extended-double format。这种格式对于指数的位数与四次精度相同,但有效位数的位数要少得多,因此可以在其中表示的最小值听起来是正确的(2 -16445


(*)您的long double可能不是四精度,因为没有处理器在硬件中实现四精度。编译器总是可以在软件中实现四精度,但更有可能将long double映射到双精度,扩展双精度或double-double

答案 1 :(得分:1)

最小的80位long double约为2 -16382 - 63 〜= 10 -4951 ,而不是2 -164934 。所以编译器是完全正确的;你的号码小于最小的次正常值。