c# - 是否有没有舍入误差的数学除法方法?

标签 c# decimal average division

是否有一种数学计算方法可以完全消除除法舍入误差?

我正在尝试即时计算传感器输出的平均值,但经过数百万次迭代后,由于舍入误差,我的平均值逐渐偏离。 enter image description here

目前,我将我的值存储在内存中,效果很好,但以内存/性能为代价。

EG

int number1 = 10;
int number2 = 3;
Console.WriteLine((number1/number2));

结果 = 3 (3.333~!)

float number1 = 10
float number2 = 3
Console.Writeline((number1/number2))

结果 = 3.33333325 (3.3~)

示例来自:https://learn.microsoft.com/en-us/dotnet/api/system.decimal?view=netcore-3.1

decimal dividend = Decimal.One;
decimal divisor = 3;
Console.WriteLine(dividend/divisor * divisor);

结果 = 0.9999999999999999999999999999 而不是 1(!!!)

这对于我的应用程序来说是一个巨大的问题,因为我不断地对传感器输出应用除法计算,并且由于这个事实,我的值会慢慢漂移。 Windows 计算器似乎可以解决这个问题。

有任何可用的解决方案还是我必须创建自己的框架?


编辑: 一个可能的解决方案可能是采用 ⅓ 以后的分数。否则可能需要采用不同的方法来解决问题。

最佳答案

算术中实际上有一种方法可以解决精度问题,无需分数。如果您的公式是动态的(不是硬编码的),那么实现起来可能会非常困难。否则,您可以重新安排您的操作,使其对于特定的数字域更加精确,例如:

(x + 1) - x 
  • 如果 float 很大,它会变成 0
  • 如果有小 float ,它会 变得有点1(小 float 比大 float 更精确)

因此,像这样重新排列它,将给出正确的结果:

(x - x) + 1

我知道示例很简单,但是对于特定操作,您应该选择特定的重新排列,例如知道接近零的 float 更加更精确,您可以只使用它们。在我的示例中,重新排列是这样的,我希望最大限度地减少变量的影响,因此我将它们彼此更紧密地联系在一起,以消除它们对大的、更不精确的 float 的膨胀。例如,如果我有这样的事情,我会赢得胜利:

x^1.05 + 1 - x^1.01

简单的动态方法通常是按升序对操作进行排序 - 从较低的 float 操作到较大的 float 。变量x,y,z等可以大或小,所以这是一个排序问题 - 每次在公式中传递这些变量时都进行排序,它会给你最好的精度。或者您可以针对不同的输入硬编码不同的重新排列排列。

这是文章:https://books.google.ru/books?id=KJORYTHOxbEC&pg=PA390&lpg=PA390&dq=rearrange+math+operations+for+precision&source=bl&ots=y8E8fjdrYy&sig=ACfU3U1vfkonygDnLJhSCK3qh0C2kaXK3w&hl=en&sa=X&ved=2ahUKEwiv6v2Xs4PqAhXGzaQKHTTUDlwQ6AEwAHoECAgQAQ

关于c# - 是否有没有舍入误差的数学除法方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62383716/

相关文章:

php - GPS 坐标的最佳 MySQL 数据库格式类型是什么?

python - 将英寸转换为米、磅转换为千克时获取小数值

vba - 我怎样才能得到平均每小时不包括 10+ 分钟的差异

c++ - 如何在 Switch 语句中使用 IF

c# - 在 EF 查询中添加 DateTime 和 TimeSpan 的代码示例

c# - 从 List<ItemDetails> 是实体的类创建 XML

c# - 我什么时候应该使用 double 而不是十进制?

ruby-on-rails - rails : how to calculate the average of a small set of elements

c# - 通过约定的多列唯一约束 FluentNHibernate 自动映射

c# - 如何将项目添加到窗口的上下文菜单中[仅适用于 pdf 文件和 doc 文件]