c++ - C++ 中的另一个双重类型技巧?

标签 c++ double

首先,我了解到C++中的double类型已经被讨论了很多次,但我搜索后无法回答我的问题。非常感谢任何帮助或想法。

我的问题的简化版本是:我得到了三个不同的结果(a=-0.926909a=-0.926947a=-0.926862) 当我使用三种不同的方法和相同的 b 值计算 a=b-c+d 时,cd,我不知道该相信哪一个。

我的问题的详细版本是:

我最近正在编写一个程序(在 Ubuntu 10.10 上使用 C++)来处理一些数据。一个函数如下所示:

void calc() {
   double a, b;
   ...
   a = b - c + d; // c, d are global variables of double
   ...
}

当我使用GDB调试上面的代码时,在调用calc()的过程中,我记录了bcd<的值 语句之前的 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() 几乎相同,除了 bcd 计算:

void calc_new() {
   double a, b;
   ...
   a = b - c + d; // c, d are global variables of double
   ...
}

这次调试的时候,a = b - c 语句前的b, cd 的值+ d 与调试 calc() 时相同:b = 54.7231c = 55.4051d = -0.244947。然而,这次在语句 a = b - c + d 执行后,我得到了 a=-0.926862。也就是说,当我计算 a = b - c + d 时,我得到了三个不同的 a 具有相同的 b 值, cd。我认为a=-0.926862a=-0.926909a=-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/

相关文章:

xcode - Swift中 double LCM的算法

JAVA:如何将 String 变量转换为 Double 变量?

c# - 具有固定指数 C# 的科学记数法的双重值(value)

c++ - 对 std::numeric_limits<double>::digits10 的误解

c++ - 输出为梯度计算中提供的单个图像并排生成 4 个图像

c++ - 输入验证难题

c# - 舍入 c# 给出错误答案

c++ - 等待 QTcpSocket 数据时阻止 GUI

使用 zeroMQ 或 boost.asio 的 C++ 数据包嗅探器

Java 文本字段十进制验证