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
吗? 存在或不存在非标准化浮点数的实际意义是什么?
答案 0 :(得分:7)
次正规数是-FLT_MIN
和FLT_MIN
(类型float
)和-DBL_MIN
以及DBL_MIN
之间的非零浮点数(对于类型{{ 1}})。常量double
通常为FLT_MIN
,即小。如果您只使用浮点数进行一些编程,您可能永远不会遇到次正规数。
在1.17549435E-38F
的编译平台上,只有数字+0。和-0。在FLT_HAS_SUBNORM == 0
和-FLT_MIN
之间。
次正规数通常用软件处理(因为它们具有异常行为而且不经常发生)。根本不处理它们的一个原因是避免它们发生时可能发生的减速。这在实时环境中很重要。
下一代英特尔台式机处理器(或者它是当前的?)将处理硬件中的子代数。
次正规数的概念与符号FLT_MIN
和33.3
无关,它们代表相同的333E-1
值。
Kahan的这些reminiscences在“渐进式下溢”中可以找到次正规的理由及其在IEEE 754中的标准化历史。
编辑:
我找不到英特尔在其下一代处理器中处理硬件子代价的来源,但我发现Nvidia's Fermi platform doing so already有一个来源。