一尘不染

如何检查是否使用了IEEE 754单精度(32位)浮点表示形式?

algorithm

我想在目标板上测试以下内容:

  • 是否使用IEEE 754单精度(32位)浮点变量实现了“ float”?
  • 是否使用IEEE 754双精度(64位)浮点变量实现“双精度”?

用简单的C程序测试它的方式是什么?


阅读 242

收藏
2020-07-28

共1个答案

一尘不染

没有简单的测试。

如今,绝大多数系统都将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中指定的其他舍入模式。或者它们可能仅用于简单的算术运算,但需要使用特定于机器的汇编语言进行访问。标准数学库(coslog等)很少支持其他舍入模式。
2020-07-28