繁体   English   中英

确保float小于C ++的两倍

[英]Make sure float is less than double C++

这是我想做的:

取一个双精度数(介于-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;
}

如果您能够使用C ++ 11,则可以使用nextafter()

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

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

IEEE 754

双

由给定的32位binary32数据(具有给定的偏置符号s ,指数e (8位无符号整数)和23位小数(尾数))假定的实际值是

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

m在哪里

在此处输入图片说明

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

第一种情况是指数e ,符号s在两次浮点转换后保存其值。 然后浮点尾数几乎是双尾数的第一个数字。 您需要稍微降低浮点尾数的值。

第二种情况 浮点数的指数(e-127)大于两倍的指数(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 */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM