在C ++中创建非规范化(次正规)浮点值

时间:2015-12-03 11:22:18

标签: c++ floating-point

出于测试目的,我需要在C ++中创建一个正数和一个负的非规范化(又称次正规)floatdouble数字。

我如何编写/制作这样的数字?

4 个答案:

答案 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位变形的范围为[0x000000010x007fffff],负面变量的范围为[0x800000010x807fffff]。

对于正值,64位变形的范围为[0x00000000000000010x000fffffffffffff],负面变量的范围为[0x80000000000000010x800fffffffffffff]。

如果在翻译联合中使用位字段,则符号位是任意的,指数为零,分数可以是任何值,但为零。

答案 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。将符号反转为负次正常。