为了检测C实现是将long double
视为double
还是另一种类型,我检查了<float.h>
的预处理器定义(即:LDBL_*
和DBL_*
)。其中一些是整数文字,其他的是浮点文字。当比较浮点数时,我得到了典型的 “比较浮点数与==或!= is unsafe”(我总是启用这个警告,因为它很有用)。
然后我想在预处理器上执行比较,但是它不能处理浮点字面值比较,所以这似乎不是一个选择。
即使启用了-Wfloat-equal
警告,我是否可以比较浮点字面值而不收到任何警告?如何执行?(测试是在运行时执行还是由预处理器执行都没有关系)。
我更喜欢C90或C99解决方案,但如果这是不可能的,后C99解决方案也将受到欢迎。
1条答案
按热度按时间5w9g7ksd1#
不需要比较浮点常量,因为它们完全由浮点类型的整数参数确定,除了
DBL_HAS_SUBNORM
或LDBL_HAS_SUBNORM
为−1的不可靠情况。(在这种情况下,DBL_TRUE_MIN
和LDBL_TRUE_MIN
将是不可靠的,因此比较它们将不可靠地指示类型是否具有相同的行为。在下面的例子中,B 是
FLT_RADIX
(float
、double
和long double
的基数相同),d 是基数-b 数字 b−1,并且在基数点之后有DBL_MANT_DIG
数字。描述了DBL
常数,并且LDBL
常数类似。DBL_MAX
等于0.ddd... ddd·B**e,其中 e 是DBL_MAX_EXP
。DBL_MIN
等于0.100...000·B**e,其中 e 为DBL_MIN_EXP
。DBL_TRUE_MIN
等于DBL_MIN
或0.000...001·B**e,其中 e 是DBL_MIN_EXP
,分别取决于DBL_HAS_SUBNORM
是0还是1。DBL_EPSILON
等于0.000...001·B**e,其中 e 为1。因此,比较整数参数提供了比较浮点常量所提供的所有信息。
如果需要比较浮点常量,选项包括:
a == b
替换为! (a < b || a > b)
。-Wfloat-equal
的情况下编译它。-Wfloat-equal
。