“符合标准的编译器可能选择不实现非规范化浮点数”的意义是什么?

时间:2013-04-29 13:00:27

标签: c floating-point language-lawyer c11

ISO / IEC 9899:2011 §5.2.4.2.2 ¶10(p48)说:

  

是否存在次正规数的特征是   实现定义的值 FLT_HAS_SUBNORM DBL_HAS_SUBNORM ,   和 LDBL_HAS_SUBNORM

     

-1不确定的
  0缺席(类型不支持次正规数)
  1现在(类型支持次正规数)

什么了!所以在某些平台上我不能写double d = 33.3?或者编译器会自动将其转换为333E-1吗? 存在或不存在非标准化浮点数的实际意义是什么?

1 个答案:

答案 0 :(得分:7)

次正规数是-FLT_MINFLT_MIN(类型float)和-DBL_MIN以及DBL_MIN之间的非零浮点数(对于类型{{ 1}})。常量double通常为FLT_MIN,即。如果您只使用浮点数进行一些编程,您可能永远不会遇到次正规数

1.17549435E-38F的编译平台上,只有数字+0。和-0。在FLT_HAS_SUBNORM == 0-FLT_MIN之间。

次正规数通常用软件处理(因为它们具有异常行为而且不经常发生)。根本不处理它们的一个原因是避免它们发生时可能发生的减速。这在实时环境中很重要。

下一代英特尔台式机处理器(或者它是当前的?)将处理硬件中的子代数。

次正规数的概念与符号FLT_MIN33.3无关,它们代表相同的333E-1值。

Kahan的这些reminiscences在“渐进式下溢”中可以找到次正规的理由及其在IEEE 754中的标准化历史。

编辑:

我找不到英特尔在其下一代处理器中处理硬件子代价的来源,但我发现Nvidia's Fermi platform doing so already有一个来源。