有没有舍入误差的数学除法方法?
Is there a Method for Math division without Rounding errors?
数学计算有没有完全消除除法舍入误差的方法?
我正在尝试即时计算传感器输出的平均值,但经过数百万次迭代后,由于舍入误差,我的平均值正在逐渐偏离。
目前我将我的值存储在内存中,这工作正常但代价是 memory/performance。
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.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
我知道示例很简单,但是对于特定的操作,您应该选择特定的重新排列,例如知道接近零的浮点数 MUCH 更精确,您可以使用它们只要。在我的示例中,重新排列是为了尽量减少变量的影响,因此我将它们彼此靠得更近,以消除它们膨胀成更大、更不精确的浮点数。例如,如果我有这样的东西,我会赢的:
x^1.05 + 1 - x^1.01
简单的动态方法通常是按升序对操作进行排序 - 从较低的浮点数操作到较大的浮点数。变量 x、y、z 等可大可小,所以这是一个排序问题 - 每次在公式中传递这些变量时都要排序,它会给你最好的精确。或者您对不同输入的不同重排排列进行硬编码。
数学计算有没有完全消除除法舍入误差的方法?
我正在尝试即时计算传感器输出的平均值,但经过数百万次迭代后,由于舍入误差,我的平均值正在逐渐偏离。
目前我将我的值存储在内存中,这工作正常但代价是 memory/performance。
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.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
我知道示例很简单,但是对于特定的操作,您应该选择特定的重新排列,例如知道接近零的浮点数 MUCH 更精确,您可以使用它们只要。在我的示例中,重新排列是为了尽量减少变量的影响,因此我将它们彼此靠得更近,以消除它们膨胀成更大、更不精确的浮点数。例如,如果我有这样的东西,我会赢的:
x^1.05 + 1 - x^1.01
简单的动态方法通常是按升序对操作进行排序 - 从较低的浮点数操作到较大的浮点数。变量 x、y、z 等可大可小,所以这是一个排序问题 - 每次在公式中传递这些变量时都要排序,它会给你最好的精确。或者您对不同输入的不同重排排列进行硬编码。