在C上定义LDBL_MAX / MIN
我正在和C一起工作,我必须做一个练习,我必须打印long double min
和long 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);
这是一个问题,因为我的赋值需要两个不同的LDBL
和DBL
值。
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的降幂来填写尾数,直到你的精度不足为止。