首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保浮动小于两倍C++

问确保浮动小于两倍C++
EN

Stack Overflow用户
提问于 2016-08-11 19:51:33
回答 2查看 241关注 0票数 0

我想做的是:

取一个双(介于-1和1之间),并将其抛到浮子上。但我想确保浮点数总是小于两倍。

有什么直截了当的方法吗?

作为参考,这是我想出的一些东西。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-11 21:11:44

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

​

。

​

​

用给定的有偏符号s、指数e(8位无符号整数)和23位分数(尾数)的给定32位binary32数据所假定的实际值为

代码语言:javascript
复制
s * m * (2 ^(e-127)), 

其中m是

​

​

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

第一种情况下,是指数e,并在双浮法下保存它的值.浮点尾数几乎是双尾数的第一位。您需要稍微减少浮点尾数的值。

第二个病例。浮子指数(e-127)大于双倍指数(e-1023) .那么我希望这个分数部分是23个零。好的。将指数部分和设定分数部分降至23。要获得字段的访问权限,请使用union。

代码语言:javascript
复制
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 */
票数 1
EN

Stack Overflow用户

发布于 2016-08-11 21:29:59

如果您能够使用C++11,那么您可以为此使用nextafter():

代码语言:javascript
复制
float doubleToSmallerFloat(double x) {
    float f = x;
    return f < x ? f : nextafter(f, -1.0f);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38904992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档