[ad_1]
请解释一下它是如何工作的? 仅当我添加整数时,程序才会给出正确的结果,但在我的任务中,我更喜欢使用 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 来提高精度只会转移问题,而不是解决问题。
[ad_2]
コメント