1

在标准中,使用四精度浮点格式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 版- 不确定它在哪个架构上运行(我意识到这可能是罪魁祸首)。请随时发布您对不同架构的发现。

4

2 回答 2

2

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


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

于 2014-09-18T15:22:49.120 回答
1

最小的 80 位long double大约是 2 -16382 - 63 ~= 10 -4951,而不是 2 -164934。所以编译器是完全正确的;你的数字小于最小的次正规数。

于 2014-09-18T15:35:17.767 回答