数学计算有没有一种方法可以完全消除除法进位错误?

问题描述 投票:0回答:1

有没有一种数学计算的方法可以完全消除除法进位误差?

我试图在飞行中计算传感器输出的平均值,但经过几百万次迭代后,我的平均值由于四舍五入错误而偏离了。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:/docs.microsoft.comen-usdotnetapisystem.decimal?view=netcore-3.1。

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

result = 0.999999999999999999999999999999 而不是1(!!)

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

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


edit:一个可能的解决方案可能是实现分数,因为⅓。否则可能需要换一种方法来解决这个问题。

c# decimal rounding division
1个回答
2
投票

其实在算术学中,有一种方法可以绕过精度问题,不用分数。但如果你的公式是动态的(不是硬编码的),那就很难实现。否则,你可以重新安排你的操作,以更精确的特定领域的数字,例如。

(x + 1) - x 
  • 对于大的浮动数,它将会变得更精确,比如:
  • 小浮动会变得有些1(小浮动比大浮动更精确)。

所以像这样重构它,在两个地方都会得到正确的结果。

(x - x) + 1

我知道这个例子很简单, 但对于特定的操作 你应该选择特定的重构, 比如说, 知道浮点数接近于零的是 MUCH 更精确,你可以只和他们一起工作。在我的例子中,重构是这样的,我想把变量的影响降到最低,所以我把它们绑得更近,以破坏它们对大的、更不精确的浮动的膨胀。例如,如果我有这样的东西,我将赢得这一点。

x^1.05 + 1 - x^1.01

琐碎的动态方法通常是按升序排列操作 -- 从较低的浮点数操作,到较大的浮点数。变量 x,y,z,等可大可小,所以这里有一个排序的问题--你每次把这些变量传到你的公式里面的时候,你都要排序,它会给你最好的精度。或者你针对不同的输入硬编码不同的排列方式。

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


0
投票

在十进制中,你必须有这样的数字问题。如果你想用更好的分数进行一些计算,你应该使用任何分数库,使用分数在内存中保存数值,并且只将结果显示为小数点数字。

© www.soinside.com 2019 - 2024. All rights reserved.