首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的浮点错误

问C++中的浮点错误
EN

Stack Overflow用户
提问于 2012-02-05 18:56:38
回答 5查看 6.4K关注 0票数 1

我需要有一些浮动分区,必须是准确的,像他们的双倍版本。我可以更改除法值-它表示一个映射,我可以对其进行偏移-以纠正最终的浮点错误。

为了纠正错误,我使用以下代码:

代码语言:javascript
复制
do 
{
    float fValue = float(x) / 1024.f;
    double oldFValue = fValue;
    double dValue = double(x) / 1024.0;
    if(oldFValue != dValue)
    {
        x += 1;
    }
    else
    {
        break;
    }
}while(1);

有了这段代码,

代码语言:javascript
复制
x = 11 

我在调试器(Visual Studio 2010)中有:

代码语言:javascript
复制
fValue = 0.010742188
oldFValue = 0.010742187500000000

你能解释一下为什么双精度值不同于浮点值吗?这是调试器问题还是浮点转换问题?我问这个是因为:

代码语言:javascript
复制
if(oldFValue != dValue)

从来都不是真的,尽管它应该是真的。我应该用其他方式比较浮点值和双精度值吗?我需要浮点除法的结果与双除法的结果完全相同。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-05 19:00:13

票数 10
EN

Stack Overflow用户

发布于 2012-02-05 19:07:37

你对single precision float了解多少?

它被存储为<sign><exponent><mantis>。您可以将最终数字写为:

代码语言:javascript
复制
(sign ? 1 : -1) * 0.1<mantis> * 2^(expontent - 127)

如你所见,number总是以数字>1和二进制小数的形式存储。不幸的是,像0.1 dec这样的数字是二进制周期的,所以用float不能得到确切的结果。

您可以尝试使用以下命令:if(oldFValue != (float)dValue),如果不起作用,您也可以尝试:

代码语言:javascript
复制
if(oldFValue*32 != (float)dValue*32)

这将导致:

代码语言:javascript
复制
mantis >> 5
expontent += 5

这可能会消除您的错误(尝试1(奇怪,但在某些情况下可能有效),2,4,8,16...,2^n)。

编辑:明确读取Johnsywebs link

票数 2
EN

Stack Overflow用户

发布于 2012-02-05 19:47:20

11 / 1024在float和double中都完全可以表示。所以当然是oldFValue == dValue。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9148656

复制
相关文章

相似问题

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