在C上定义LDBL_MAX / MIN

我正在和C一起工作,我必须做一个练习,我必须打印long double minlong double max

我使用float.h作为标题,但是这两个宏( LDBL_MIN/MAX )给了我相同的值,好像它只是一个双LDBL_MIN/MAX值。

我正在使用Visual Studio 2015,如果我将鼠标hover在LDBL MIN它会显示#define LDBL_MIN DBL_MIN 。 这就是为什么它打印dbl_min而不是ldbl_min

我该如何解决这个问题?

 printf("Type: Long Double Value: %lf Min: %e Max: %e Memory:%lu\n", val10, LDBL_MIN, LDBL_MAX, longd_size); 

这是一个问题,因为我的赋值需要两个不同的LDBLDBL值。

C没有指定long double必须具有比double更大的精度/范围。

因此,即使实现将它们视为不同类型,它们也可能具有相同的实现,范围,精度,最小值,最大值等。

关于Visual Studio, MS Long Double有帮助。

解决此问题,请使用另一个支持long double编译器,其精度/范围大于double 。 GCC也许?

从这个关于lfoating点类型的参考 :

long double精度浮点型。 如果支持,则匹配IEEE-754扩展浮点类型,否则匹配一些非标准扩展浮点类型,只要其精度优于double并且范围至少与double一样好, 否则匹配double类型 。 某些x86和x86_64实现使用80位x87浮点类型。

增加的重点是我的。

上面引用的内容是,虽然兼容的C编译器必须具有long double类型,但它实际上不必支持它而不是double 。 Visual Studio C编译器可能就是这种情况。

这些宏要么被破坏,要么long double只是系统上double的别名。 要进行测试,请将long double设置为DBL_MAX,乘以2,然后从中减去DBL_MAX。 如果结果是有限的,那么你在long double中有额外的指数空间。 如果不是,并且long double大于double,则额外的字节可能只是填充,或者您可以具有相同的指数空间和更高的精度。 所以LDBL_MAX的真正价值只是比DBL_MAX更好。

生成max的最简单方法就是查找二进制表示。 但是,如果你想在便携式C中进行,你可以通过重复乘法来探测它,以获得幅度,然后通过重复添加2的降幂来填写尾数,直到你的精度不足为止。