一次性作业之间的精确度是否有任何差异:
res=n/k
Run Code Online (Sandbox Code Playgroud)
循环中的多个赋值:
for i in range(n):
res+=1/k
Run Code Online (Sandbox Code Playgroud)
?
浮点除法a/b不是数学除法a ÷ b,除非是非常罕见的情况.
通常,浮点除法a/b是一个 ÷ b +ε.
这有两个原因.
浮点数(极少数情况除外)是十进制数的近似值.
a是一个 +εA.
b是b +εb.
浮点数使用小数点右侧数字的基数2编码.写入时3.1,会扩展为基数为2的近似值,与实际值相差很小.
顺便说一下,实数十进制数也有同样的问题.记下1/3的十进制扩展.哎呀.你必须在某个时候停止写小数位.二进制浮点数具有相同的问题.
Division具有固定数量的二进制位,意味着答案被截断.如果有重复的二进制模式,它会被切断.在极少数情况下,这无关紧要.一般来说,你通过分裂引入了错误.
因此,当您执行重复添加1/k值时,您正在计算
1÷ k +ε
并添加了这些.你的结果(如果你有权利的话range)就是
n ×(1÷ k +ε)= n ÷ k + n ×ε
你把小误差ε乘以n.这是一个很大的错误.(在极少数情况下除外.)
这是不好的.很坏.所有浮点除法都会引入错误.你作为程序员的工作是做代数以避免或推迟除法以防止这种情况.良好的软件设计意味着良好的代数,以防止除法运算符引入错误.
[*极少数情况.在极少数情况下,小错误恰好为零.罕见的情况发生在你的浮点值是小的整数或分数,即两个1/2,1/4,1/8等的幂的总和.在极少数情况下,你有一个良性数字与良性分数部分,错误将为零.]
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |