首页 > 编程问答 >数学运算的奇怪结果

数学运算的奇怪结果

时间:2024-08-01 06:30:13浏览次数:8  
标签:python precision physics uncertainty

看:

A = 11.531681447264651
B = 10.276344990825836
C = 0.11732116415316027
D = 10.7

现在,尝试一下:

A - B - C*D

结果: 6.661338147750939e-16

  1. 为什么结果这么小?

但是,让我们四舍五入:

round(A,1) - round(B,1) -round(C,1)*round(D,1)

结果: 0.12999999999999923

很好的结果!如果在计算器中尝试

11.5 − 10.3 −0,1×10.7 = 0.13
  1. 为什么 6.6e-16 之前和现在 0.129999

其他奇怪的事情:

round(A,2) - round(B,2) -round(C,2)*round(D,2)

结果: -0.03399999999999981

  1. 为什么现在是负数?

  2. 我的实验结果精度为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

相关文章