看:
A = 11.531681447264651
B = 10.276344990825836
C = 0.11732116415316027
D = 10.7
现在,尝试一下:
A - B - C*D
结果:
6.661338147750939e-16
- 为什么结果这么小?
但是,让我们四舍五入:
round(A,1) - round(B,1) -round(C,1)*round(D,1)
结果:
0.12999999999999923
很好的结果!如果在计算器中尝试
11.5 − 10.3 −0,1×10.7 = 0.13
-
为什么
6.6e-16
之前和现在0.129999
?
其他奇怪的事情:
round(A,2) - round(B,2) -round(C,2)*round(D,2)
结果:
-0.03399999999999981
-
为什么现在是负数?
-
我的实验结果精度为1,所以,在做这个数学之前,我应该把所有 A、B 和 C 数字都精确到 1,对吗?
我尝试了所有变体,并在数学之前使用
round(x,my_precision)
解决了问题,但我想了解发生了什么
这些行为都是由于在计算机中使用有限精度表示小数(例如浮点数)造成的。下面我将详细解释的问题:
1. 为什么第一个结果这么小?
数字
6.661338147750939e-16
实际上是非常小的一个数字,接近于零。这个结果被称为
舍入误差
。计算机使用二进制系统来表示数字,而很多十进制小数无法用二进制精确表示,只能近似表示。在进行一系列计算后,这些微小的近似误差会累积,导致最终结果出现偏差。
2. 为什么使用
round
函数后结果不同?
当使用
round
函数时,改变了数字的精度。在第一个例子中,保留了所有小数位数进行计算,而在第二个例子中,将数字四舍五入到一位小数。这减少了计算中涉及的有效数字,从而影响了舍入误差的累积。
在的例子中,
round(A, 1) - round(B, 1) - round(C, 1) * round(D, 1)
的计算过程实际上是:
11.5 - 10.3 - 0.1 * 10.7
= 11.5 - 10.3 - 1.07
= 0.13
由于每一步计算都只保留了一位小数,因此舍入误差的影响被最小化了,最终结果与用计算器得到的结果一致。
3. 为什么第三个结果是负数?
当将数字四舍五入到两位小数时,
round(C, 2)
将
C
从
0.1173...
四舍五入到
0.12
。这增加了一个小的正误差。在后续计算中,这个正误差被放大,最终导致结果变为负数。
4. 是否应该在计算之前将所有数字都精确到所需的精度?
这取决于的具体需求和应用场景。
- 如果的目标是得到一个特定精度的最终结果,那么在计算之前将所有数字四舍五入到该精度是一种可行的方法。 这样可以确保最终结果满足的精度要求。
- 但是,如果需要尽可能保持计算过程中的精度,那么应该尽可能晚地进行四舍五入操作。 过早地进行四舍五入可能会导致误差累积,并影响最终结果的准确性。
总而言之,理解浮点数的精度限制对于进行数值计算至关重要。在处理浮点数时,应始终注意舍入误差的存在,并根据具体情况选择合适的精度和计算方法。
标签:python,precision,physics,uncertainty From: 78818489