C 中 double 类型的运算

编程


请解释一下它是如何工作的? 仅当我添加整数时,程序才会给出正确的结果,但在我的任务中,我更喜欢使用 double 类型。

工作选项:
`

C++
for (int i = -10000; i < 10000; i++) {
    formula = s1 / (v1 + k) + s2;
    if (formula == 0) {
        break;
}
    k += 1;
}

结果:3.000000
`

它无法正常工作:
`

C++
for (int i = -10000; i < 10000; i++) {
    formula = s1 / (v1 + k) + s2;
    if (formula == 0) {
        break;
}
    k += 0.00001;
}

结果:0.200000
`

我尝试过的:

在我的程序中,我需要更精确的结果,所以我不能使用 int 类型。

解决方案1

第一步是确定变量 formula, s1, s2, v1, 和 k 都是 double 类型。 实际上你并不需要所有的都是双打,但你想确保结果(formula) 是一个双精度数并且除法 必须 与双打一起完成。 整数结果几乎肯定会给出错误的结果。

第二步是注意与双精度值的相等比较,即测试是否 formula 为零。 通常的技术是定义一个 epsilon 值,它的意思是“足够接近”并与之比较。 这是一个例子:

C++
const double epsilon = 1.0E-9;

// do calculations here

double delta = fabs( formula );
if( delta < epsilon )
    break;

这将跳出 for 循环,如果 formula 范围在 -1E-9 和 +1E-9 之间。 您可以使用 1.0E-6 或 epsilon 的其他值,只要它在您所需的计算容差范围内即可。

解决方案2

这里有几件事需要注意。 每次循环似乎只有变量 k 发生变化。

C
for (int i = -10000; i < 10000; i++) {
  formula = s1 / (v1 + k) + s2;
  if (formula == 0) {
	break;
  }
  k += 0.00001;
}

不幸的是,值 k += 0.00001 无法精确存储为浮点(或双精度),因此编译器通常使用最接近的值。 如果您现在将这些不完全匹配的双数相加,则总和中的误差会随着每次循环而增加。

现在有几种方法可以解决这个问题。
1.与其不断地重复相加,不如乘以切片索引一次,这样可以大大提高精度。
2. 与其直接比较两个浮点数,不如检查差异,其中差异通常不会变为 0,而是应低于指定值。

使用 double 而不是 float 来提高精度只会转移问题,而不是解决问题。

コメント

タイトルとURLをコピーしました