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

use*_*859 5 c algorithm floating-point double

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

  • 使用IEEE 754单精度(32位)浮点变量实现'float'吗?
  • 使用IEEE 754双精度(64位)浮点变量实现"双重"吗?

有什么方法可以用简单的C程序测试它.

Eri*_*hil 6

没有简单的测试.

今天绝大多数系统都使用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,等等)很少支持其它舍入模式.