确保float小于C ++

时间:2016-08-11 19:51:34

标签: c++ floating-point

这是我想做的事情:

  

取一个double(介于-1和1之间)并将其转换为浮点数。但我想确保浮动总是小于双倍。

有没有直截了当的方法呢?

供参考,这是我提出的一些内容。

float DoubleToSmallerFloat (double X) // ex. X = 0.79828470019999997
{
    float  Y = X; // 0.79828471 -> note this is greater than X

    double Diff = X - Y;
    return Y - Abs (Diff) * 10;
}

2 个答案:

答案 0 :(得分:5)

如果您能够使用C ++ 11,那么您可以使用enter image description here

float doubleToSmallerFloat(double x) {
    float f = x;
    return f < x ? f : nextafter(f, -1.0f);
}

答案 1 :(得分:1)

我认为这是一个很好的问题。查看IEEE 754单精度和双精度二进制浮点格式

IEEE 754

Double

具有给定偏置符号 s ,指数 e (8位无符号整数)的给定32位二进制32数据假定的实际值,以及23位分数(尾数)是

s * m * (2 ^(e-127)), 

其中 m

enter image description here

对于双重使用1023而不是127:s * m * (2 ^(e-1023))

第一种情况是指数 e 并且签署 s 在双浮动投射后保存其值。然后浮动尾数几乎是双尾数的第一个数字。你需要略微减少float mantissa的值。

第二种情况。 float的指数(e-127)大于double的指数(e-1023)。然后我希望分数部分是23个零。好。减少指数部分并将分数部分设置为23个。要访问字段,请使用union。

union {
    float    fl;
    uint32_t dw;
} f;
int s = ( f.dw >> 31 ) ? -1 : 1;   /* sign */
int e = ( f.dw >> 23 ) & 0xFF;     /* exponent */
int fract = f.dw & 0x7FFFFF;       /* fraction */