gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:39:37 25 4
gpt4 key购买 nike

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

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

目前我将我的值存储在内存中,它工作正常,但以内存/性能为代价。

例如

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://docs.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 
  • 大浮点数会变成 0
  • 带有小浮子,它会
    变得有点 1(小浮点数比大浮点数更精确)

  • 所以像这样重新排列它,将在两者中给出正确的结果:
    (x - x) + 1

    我知道例子是微不足道的,但对于特定的操作,你应该选择特定的重新排列,例如知道接近零的浮点数是 更准确地说,您只能使用它们。在我的示例中,重新排列是为了尽量减少变量的影响,所以我将它们彼此绑得更近,以将它们的膨胀破坏为更大、更不精确的浮点数。例如,如果我有这样的东西,我会赢的:
    x^1.05 + 1 - x^1.01

    简单的动态方法通常是按升序对操作进行排序 - 从较低的浮点数操作到较大的浮点数。变量 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com