有没有一种数学计算的方法可以完全消除除法进位误差?
我试图在飞行中计算传感器输出的平均值,但经过几百万次迭代后,我的平均值由于四舍五入错误而偏离了。
目前,我将我的值存储在内存中,这很好用,但以内存性能为代价。
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:一个可能的解决方案可能是实现分数,因为⅓。否则可能需要换一种方法来解决这个问题。
其实在算术学中,有一种方法可以绕过精度问题,不用分数。但如果你的公式是动态的(不是硬编码的),那就很难实现。否则,你可以重新安排你的操作,以更精确的特定领域的数字,例如。
(x + 1) - x
所以像这样重构它,在两个地方都会得到正确的结果。
(x - x) + 1
我知道这个例子很简单, 但对于特定的操作 你应该选择特定的重构, 比如说, 知道浮点数接近于零的是 MUCH 更精确,你可以只和他们一起工作。在我的例子中,重构是这样的,我想把变量的影响降到最低,所以我把它们绑得更近,以破坏它们对大的、更不精确的浮动的膨胀。例如,如果我有这样的东西,我将赢得这一点。
x^1.05 + 1 - x^1.01
琐碎的动态方法通常是按升序排列操作 -- 从较低的浮点数操作,到较大的浮点数。变量 x,y,z,等可大可小,所以这里有一个排序的问题--你每次把这些变量传到你的公式里面的时候,你都要排序,它会给你最好的精度。或者你针对不同的输入硬编码不同的排列方式。
在十进制中,你必须有这样的数字问题。如果你想用更好的分数进行一些计算,你应该使用任何分数库,使用分数在内存中保存数值,并且只将结果显示为小数点数字。