出于测试目的,我需要在C ++中创建一个正数和一个负的非规范化(又称次正规)float
和double
数字。
我如何编写/制作这样的数字?
答案 0 :(得分:4)
您可以使用-std::numeric_limits<T>::denorm_min()
和std::numeric_limits<T>::denorm_min()
。生成的非规范化值具有特殊的特征是偶然的。如果您不想这样,请乘以一些相当小的整数值。
答案 1 :(得分:3)
要获得完全的灵活性和覆盖率,请使用无符号整数值和相同大小的浮点值创建联合。对于32位值,可能是unsigned int + float,对于64位值,可能是unsigned long + double。将所需的denorm值存储在整数字段中,并读出相应的浮点值。如果你想得到想象,请为浮点数的符号,指数和小数部分指定带位字段的整数。
对于正值,32位变形的范围为[0x00000001
,0x007fffff
],负面变量的范围为[0x80000001
,0x807fffff
]。
对于正值,64位变形的范围为[0x0000000000000001
,0x000fffffffffffff
],负面变量的范围为[0x8000000000000001
,0x800fffffffffffff
]。
如果在翻译联合中使用位字段,则符号位是任意的,指数为零,分数可以是任何值,但为零。
答案 2 :(得分:1)
以下只是为了演示如何在内存中形成非规范化浮点值。
const unsigned long lnDEN[2] = {0x0000001, 0x00000000};
const double A_DENORMAL = *( double* )lnDEN;
double dPositiveDeNormal = A_DENORMAL;
double NegativeDeNormal = - A_DENORMAL;
事情的标准方式当然是@DietmarKüh提到的
答案 3 :(得分:0)
另一种方法显然是采用最小标准化值DBL_MIN
(或者,std::numeric_limits<double>::min()
)并将其除以某种东西;同样适用于float
。将符号反转为负次正常。