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

Vor*_*rac 1 c floating-point language-lawyer c11

ISO/IEC 9899:2011§5.2.4.2.210(p48)说:

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

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

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

Pas*_*uoq 7

次正规数是-FLT_MIN和FLT_MIN(对于类型float)-DBL_MIN和DBL_MIN(对于类型double)之间的非零浮点数.常量FLT_MIN是典型的1.17549435E-38F,就是小.如果只使用浮点数进行一些编程,则可能永远不会遇到次正规数.

在编译平台上FLT_HAS_SUBNORM == 0,只有数字+0.和-0.之间-FLT_MIN和FLT_MIN.

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

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

次正规数的概念无关,与符号33.3和333E-1,这表示相同double的值.

在"渐进式下溢"中,Kahan 在这些回忆中可以找到低于正常现象的理由和IEEE 754标准化的历史.

编辑:

我找不到英特尔在其下一代处理器中处理硬件次正规的来源,但我发现Nvidia的Fermi平台已经这样做了.