我有一个非常恼人的问题,在Java中有很多浮点数或双打数.基本上这个想法是,如果我执行:
for ( float value = 0.0f; value < 1.0f; value += 0.1f )
System.out.println( value );
Run Code Online (Sandbox Code Playgroud)
我得到的是:
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
Run Code Online (Sandbox Code Playgroud)
我明白浮动精度误差的积累,但是,如何摆脱这个?我尝试使用双打错误的一半,但结果仍然相同.
有任何想法吗?
如果我们天真地计算平均值:
std::vector<double> values;
double sum = std::accumulate(begin(values), end(values), 0.0);
double mean = sum / values.size();
Run Code Online (Sandbox Code Playgroud)
并且values.size()很大,我们可能会得到不准确的结果,因为浮点数在较高范围内的分辨率较低.或者更糟糕的是,如果我理解正确,我们可以获得无限的结果.
当我们有偶数个值时,我们可以计算前半部分的平均值,然后计算第二个的平均值,并找到这两个均值的平均值.
这似乎不是一个新问题,但我很难找到资源.我觉得有更复杂的技术与权衡中
我想知道是否有人将它们总结到某个地方甚至更好,如果它们在某些图书馆中可用的话.
我试图总结一个正向递减浮点的排序数组.我已经看到,总结它们的最佳方法是开始将数字从最低到最高加起来.我写这个代码的例子是,但是,从最高数字开始的总和更精确.为什么?(当然,总和1/k ^ 2应为f = 1.644934066848226).
#include <stdio.h>
#include <math.h>
int main() {
double sum = 0;
int n;
int e = 0;
double r = 0;
double f = 1.644934066848226;
double x, y, c, b;
double sum2 = 0;
printf("introduce n\n");
scanf("%d", &n);
double terms[n];
y = 1;
while (e < n) {
x = 1 / ((y) * (y));
terms[e] = x;
sum = sum + x;
y++;
e++;
}
y = y - 1;
e = e - …Run Code Online (Sandbox Code Playgroud) 我正在读考试,我解决了这个问题
添加0.1 + 0.2 + ... + 1.00 ..或1.00 + 0.99 + 0.98 + ... + 0.1
在哪个位置添加数字以获得更高的Java准确性?