标签: floating-accuracy

平均的哪些实现最准确?

鉴于这两个平均函数的实现:

float average(const vector<float>& seq)
{
  float sum = 0.0f;

  for (auto&& value : seq)
  {
    sum += value;
  }

  return sum / seq.size();
}
Run Code Online (Sandbox Code Playgroud)

和:

float average(const vector<float>& seq)
{
  float avg = 0.0f;

  for (auto&& value : seq)
  {
    avg += value / seq.size();
  }

  return avg;
}
Run Code Online (Sandbox Code Playgroud)

为了说明我的问题,想象一下我们在输入数据上有很大的不同,如下所示:

1.0f, 0.0f, 0.0f, 0.0f, 1000000.0f
Run Code Online (Sandbox Code Playgroud)

我的猜测是,在第一个实现中,sum可以增长"太多"并且松散最低有效数字而1000000.0f不是1000001.0f在求和循环结束时.

另一方面,由于要执行的分割数量,第二个实现似乎在理论上效率较低(我没有描述任何内容,这是一个盲目的猜测).

那么,这些实现中的一个是否优于另一个?我是否认为第一次实施不太准确?

c++ algorithm floating-accuracy

-1
推荐指数
1
解决办法
204
查看次数

循环中递增值会产生不同(错误)的值?

我花了差不多整天试图弄清楚为什么会发生这种情况,如果它不是一个完整的数字直到它是一个整数,我的代码会增加一个浮点数,我会通过递增0.01和循环来触发它继续将它递增0.01直到它是一个整数然而它永远不会停止,调试它我注意到随着循环的进展而变得越来越不准确的数字导致它在结束时被0.0000066输出.
我想也许这个变量可能是以某种方式被别处访问所以我只是在一个空的"主"程序中创建它:

float value = 0;
for (int i=0; i<100; i++) {
    value += 0.01f;
}
System.out.println(value); // Displays 0.99999934
System.out.println(value == 1); // Just in case it's displaying wrong in println (displays false)
Run Code Online (Sandbox Code Playgroud)

到底为什么这不是1?我不认为它可能与数据类型有任何关系,因为我正在向浮点数添加浮点数.

java loops floating-accuracy

-1
推荐指数
1
解决办法
227
查看次数

打印出一个非常小的浮点数

我有以下代码:

float test = 1/(10^(15));
std::cout << "test: " << test << std::endl;
Run Code Online (Sandbox Code Playgroud)

但我得到"test:0"作为值.我想要"测试:0.000000000000001".

我该如何实现这一目标?

c++ floating-point floating-accuracy

-1
推荐指数
1
解决办法
190
查看次数

为什么 4.7 在 c 中是 4.6999999

'

#include <stdio.h>
#include <math.h>

int main(){  
        int i;  
        float num = 4.700;   
        for(i=1;i<5;i++){ 
              printf("%0.3f\tx%d\t\t=%d\n",num,(int)pow(10,i),(int)(num*pow(10,i)));
        }  
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

' 此代码将以下内容打印到控制台: '

4.7000   x10        =46  
4.7000   x100       =469  
4.7000   x1000      =4699  
4.7000   x10000     =46999
Run Code Online (Sandbox Code Playgroud)

' 这个结果与所有浮点值不一致

1.2000 打印出 ...120...1200 等等
1.8000 又是奇怪的

我在 Codeblocks 工作,我的问题是为什么有些浮点数会以这种方式做出反应?我缺少 C 或 mingw 编译器的一些基础知识吗?还是我的代码有问题?
感谢您的帮助,如果是重复问题,请见谅

c mingw codeblocks floating-accuracy

-2
推荐指数
1
解决办法
59
查看次数

浮点减法给我不准确的结果

我正在编写一个代码,其中每半秒进行一次测量,需要从初始值中减去最终达到0.两个值都是浮点数.初始值为140 000 000,测量范围为0.320000001至0.389999999.

    float batt = 140000000.00; //capacity 140M units
    float subtr;

    /.../
    while(1){
          batt = float(batt - subtr);
    /.../
    }
    
Run Code Online (Sandbox Code Playgroud)

所以基本上我需要它从148,000,000.00的每个循环减去0.3xxxxxxxx,但似乎有一个大小问题所以当我调试它时我仍然每次得到148M.

我尝试使用1000x较小的battbatt值,148 000,并将测量值从0.3xxxxxxxx转换为0.0003xxxxxxxx.调试代码时,148000 - 0.000300005049(测量值)给出147999.469,这是预期结果(147,999.999,699)的.530699.

似乎浮动对我的需求不够准确,我应该将我的值转换为其他类型,还是有其他方法可以获得准确的结果?正在考虑将测量值转换为没有小数的值,但这也不会起作用,因为初始值对于float(148*10 ^ 15)来说太大了.当使用140,000,000.00时,我希望得到三位小数(.xxx)的准确度,并相应地使用140,000.00准确度的六位小数(.xxx,xxx).

c++ floating-accuracy subtraction

-2
推荐指数
1
解决办法
84
查看次数

-4
推荐指数
2
解决办法
260
查看次数

如何在android中使用double获得精确位的答案

我已经在android上制作了一个计算器应用程序,但每当我做一些这样的乘法:

23.3 x 3.3
Run Code Online (Sandbox Code Playgroud)

我得到的答案是这样的:

76.988999999999
Run Code Online (Sandbox Code Playgroud)

现在请告诉我如何使用此应用程序解决此冲突.答案应该是这样的

76.89
Run Code Online (Sandbox Code Playgroud)

java double android floating-accuracy floating-point-precision

-5
推荐指数
1
解决办法
104
查看次数