我想问一个跟这个问题相关的问题,该问题已通过检查编译器使用标准来很好地回答了。但是这仅适用于C语言。在C++中是否有相同的方法?
我不想将浮点类型转换为文本或使用某些相当复杂的转换函数,我只需要进行编译器检查。如果您知道这样的兼容编译器列表,请发布链接。我找不到它。
我想问一个跟这个问题相关的问题,该问题已通过检查编译器使用标准来很好地回答了。但是这仅适用于C语言。在C++中是否有相同的方法?
我不想将浮点类型转换为文本或使用某些相当复杂的转换函数,我只需要进行编译器检查。如果您知道这样的兼容编译器列表,请发布链接。我找不到它。
std::numeric_limits<double>::is_iec559;
或者:
std::numeric_limits<float>::is_iec559;
is_iec559
应该为false。或者,根据某些编译器开关,它应该是软件模拟和true
,或者IEEE 754不兼容和false
。对我来说,这似乎不是一个概念上的问题,但也许我漏掉了什么。 - cubuspl42is_iec559
为 false
的情况,因为该类型仅与 IEEE 754 兼容度达到了 99.99%。我不记得当时为什么会这样想,但根据我上面的评论,我认为问题的真正需要知道的是是否使用了 IEEE 格式,而不是是否严格遵循了 IEEE 语义。因此会有假阴性,但由于问题的真正需求没有正式定义,所以无法避免。 - Steve Jessopis_iec559
错误地为某些几乎但不完全符合IEEE 754标准的目标。这些天,流行的架构可能确实是正确的,这在保持流行的要求下也是必要的;-) - Steve Jessop虽然这篇文章有点老(10年),但你仍然可以尝试。它也适用于C语言:
#ifndef __STDC_IEC_559__
#error The following Programm only supports float operations using the IEEE 754 Standard
#endif
__STD_IEC_559__
是由编译器自身定义的吗?在 C99 中,它在 math.h 中定义,因此您必须先 #include <math.h>
然后测试该定义。在 C++ 中它在哪里定义? - wovano
std::numeric_limits<double>::is_iec559()
来检查特定浮点类型是否按照IEEE 754标准表示。当然,这并不能说明编译器的浮点数处理是否符合754标准,但这应该会给您一个很好的提示。 - Alexander Gesslerconstexpr
,但你正在回复一个早于C++11的评论。 - Ben Voigt