如何检查是否使用了IEEE 754单精度(32位)浮点表示形式?
问题内容:
我想在目标板上测试以下内容:
- 是否使用IEEE 754单精度(32位)浮点变量实现了“ float”?
- 是否使用IEEE 754双精度(64位)浮点变量实现“双精度”?
用简单的C程序测试它的方式是什么?
问题答案:
没有简单的测试。
如今,绝大多数系统都将IEEE-754格式用于浮点运算。但是,大多数C实现并不完全符合IEEE 754(与IEC
60559相同),并且没有设置预处理器标识符__STDC_IEC_559__
。在没有此标识符的情况下,确定C实现是否符合IEEE
754的唯一方法是以下一项或组合:
- 阅读其文档。
- 检查其源代码。
- 对它进行测试(当然,当只能进行详尽的测试时,这很困难)。
在许多C实现和软件应用程序中,可以忽略或解决与IEEE 754的差异:您可以像使用IEEE
754一样编写代码,并且很多代码都可以工作。但是,有很多事情可以使毫无戒心的程序员失望。即使遵守完整的规范,编写完全正确的浮点代码也很困难。
常见偏差包括:
- 中间算术比标称类型更精确地执行。例如,
double
可以long double
精确地计算使用值的表达式。 sqrt
并非在每种情况下都返回正确舍入的值。- 其他数学库例程返回的值可能与正确取整的结果略有不同(几个ULP)。(实际上,没有人以保证正确的舍入和保证的绑定运行时间来实现IEEE 754-2008中推荐的所有数学例程。)
- 次标准数字(浮点格式边缘附近的小数字)可能会转换为零,而不是按照IEEE 754的规定进行处理。
- 十进制数字(例如,
3.1415926535897932384626433
在源代码中)和二进制浮点格式(例如,通用double
格式,IEEE-754 64位二进制)之间的转换在任何一个转换方向上都不一定总是正确舍入。 - 仅支持“从最近到最近”模式;不支持IEEE 754中指定的其他舍入模式。或者它们可能仅用于简单的算术运算,但需要使用特定于机器的汇编语言进行访问。标准数学库(
cos
,log
等)很少支持其他舍入模式。