C11,5.2.4.2.2 浮动类型的特征 <float.h>,10,脚注 26:
如果没有浮点运算从非次正规输入产生次正规结果,即使类型格式包括次正规数的表示,也打算将其表征为不存在。
这里的“次正常结果”是在四舍五入之前还是在四舍五入之后确定的?
测试表明,有些实现是在舍入之前做的,有些实现是在舍入之后做的。
这是测试:
#if FLT_HAS_SUBNORM == 0
int subnorm_determ_method( void )
{
volatile float f1 = FLT_MIN; /* 1.17549435e-38f */
volatile float f2 = 1.0000001f;
volatile float f3;
int r;
r = fesetround(FE_UPWARD);
if ( r != 0 ) return -1; /* error: fesetround(FE_UPWARD) failed */
f3 = f1 / f2;
if ( f3 == FLT_MIN ) return 0; /* "subnormal results" are determined after rounding */
if ( f3 == 0.0f ) return 1; /* "subnormal results" are determined before rounding */
return -2; /* error: unexpected result */
}
#endif
UPD(在完成更多研究/实验之后)。
- FTZ 逻辑的确切执行位置与这个问题无关:无论是在舍入前还是舍入后执行 FTZ 逻辑,舍入(交付)的结果都不是次正规的。
- 如果一个实现不支持次正规数,那么这种实现不符合 IEEE 754。因此,这种实现可以自由选择在哪一步执行 FTZ 逻辑。实验证实: FTZ=1(或永久 FTZ=1)配置的不同实现可能在不同的步骤执行 FTZ 逻辑,因此产生不同的结果:
±0.0
或±<TYPE_PREFIX>_MIN
. - 额外:在 FTZ=1 的情况下引发浮点异常:与 2 中的情况相同。:IEEE 754 不符合标准的实现可以自由地做他们想做的事。