Python:哪种方式可以提供更好的精度

Ivr*_*vri 0 python precision

一次性作业之间的精确度是否有任何差异:

res=n/k
Run Code Online (Sandbox Code Playgroud)

循环中的多个赋值:

for i in range(n):
    res+=1/k
Run Code Online (Sandbox Code Playgroud)

S.L*_*ott 8

浮点除法a/b不是数学除法a ÷ b,除非是非常罕见的情况.

通常,浮点除法a/b一个 ÷ b +ε.

这有两个原因.

  1. 浮点数(极少数情况除外)是十进制数的近似值.

    a一个 +εA.

    bb +εb.

    浮点数使用小数点右侧数字的基数2编码.写入时3.1,会扩展为基数为2的近似值,与实际值相差很小.

    顺便说一下,实数十进制数也有同样的问题.记下1/3的十进制扩展.哎呀.你必须在某个时候停止写小数位.二进制浮点数具有相同的问题.

  2. Division具有固定数量的二进制位,意味着答案被截断.如果有重复的二进制模式,它会被切断.在极少数情况下,这无关紧要.一般来说,你通过分裂引入了错误.

因此,当您执行重复添加1/k值时,您正在计算

k

并添加了这些.你的结果(如果你有权利的话range)就是

n ×(1÷ k +ε)= n ÷ k + n ×ε

你把小误差ε乘以n.这是一个很大的错误.(在极少数情况下除外.)

这是不好的.很坏.所有浮点除法都会引入错误.你作为程序员的工作是做代数以避免或推迟除法以防止这种情况.良好的软件设计意味着良好的代数,以防止除法运算符引入错误.

[*极少数情况.在极少数情况下,小错误恰好为零.罕见的情况发生在你的浮点值是小的整数或分数,即两个1/2,1/4,1/8等的幂的总和.在极少数情况下,你有一个良性数字与良性分数部分,错误将为零.]