首先,我了解到C++中的double类型已经被讨论了很多次,但我搜索后无法回答我的问题。非常感谢任何帮助或想法。
我的问题的简化版本是:我得到了三个不同的结果(a=-0.926909
、a=-0.926947
和 a=-0.926862
) 当我使用三种不同的方法和相同的 b
值计算 a=b-c+d
时,c
和 d
,我不知道该相信哪一个。
我的问题的详细版本是:
我最近正在编写一个程序(在 Ubuntu 10.10 上使用 C++)来处理一些数据。一个函数如下所示:
void calc() {
double a, b;
...
a = b - c + d; // c, d are global variables of double
...
}
当我使用GDB调试上面的代码时,在调用calc()的过程中,我记录了b
、c
和d<的值
语句之前的 a = b - c + d
如下:
b = 54.7231
c = 55.4051
d = -0.244947
执行语句a = b - c + d
后,我发现计算的是a=-0.926909
而不是-0.926947
通过计算器。好吧,到目前为止还不是很困惑,因为我猜这可能只是一个精度问题。后来出于某种原因我重新实现了另一个版本的calc()
。我们称这个新版本为 calc_new()
。 calc_new()
与 calc()
几乎相同,除了 b
、c
和 d
计算:
void calc_new() {
double a, b;
...
a = b - c + d; // c, d are global variables of double
...
}
这次调试的时候,a = b - c 语句前的
与调试 b
, c
和d
的值+ dcalc()
时相同:b = 54.7231
、c = 55.4051
、d = -0.244947
。然而,这次在语句 a = b - c + d
执行后,我得到了 a=-0.926862
。也就是说,当我计算 a = b - c + d
时,我得到了三个不同的 a
具有相同的 b
值, c
和 d
。我认为a=-0.926862
、a=-0.926909
和a=-0.926947
之间的差异不小,但我无法找出原因.哪个是正确的?
非常感谢, 汤姆
最佳答案
如果您希望答案精确到小数点后第 5 位和第 6 位,则您需要确切知道这些位的计算输入是什么。您看到的输入只有 4 位小数,您还需要显示它们的第 5 位和第 6 位。然后我想你会看到一个可以理解的情况,将你的计算器匹配到小数点后 6 位。 Double 具有足够的精度来完成这项工作,如果您计算两个非常相似的数字的差值(您不是),这里只会出现精度问题。
编辑:不出所料,提高显示精度也会向您显示 calc() 和 calc_new() 正在为计算提供不同的输入。感谢 Mike Seymour 和 Dietmar Kuhl 在评论中最先看到您的实际问题。
关于c++ - C++ 中的另一个双重类型技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9762844/