这是我想做的:
取一个双精度数(介于-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;
}
最佳答案
我认为这是一个好问题。查看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 */