回答
浮点除法a/b
不是数学除法一个÷b,除了在极少数情况下,*。
通常,浮点除法a/b
是一个÷b +ε。
这是真的有两个原因。
浮点数(极少数情况除外)是十进制数的近似值。
a
是a +εa。b
是b +εb。浮点数使用基数2编码小数点右侧的数字。当你写
3.1
时,这被扩展到基数2的近似值,它与实际值相差很小。顺便说一下,实数十进制数有相同的问题。写下1/3的小数点扩展。哎呀。你必须停止在某个点写小数位。二进制浮点数有同样的问题。该分区具有固定数量的二进制位,意味着该答案被截断。如果有重复的二元模式,它会被切碎。在极少数情况下,这并不重要。一般来说,你通过分区引入了错误。
因此,当你做这样的事情反复添加1/k
值你计算
1÷ķ +ε
以及将这些了。你的结果(如果你有正确的range
)将
ñ×(1÷ķ +ε)= ñ÷ķ + ň×ε
您已经将小误差乘以n。这是一个很大的错误。 (除少数情况外)。
这很糟糕。很坏。所有的浮点除法都会引入一个错误。你作为一名程序员的工作是做代数来避免或推迟分工来防止这种情况发生。良好的软件设计意味着良好的代数,以防止分部运营商引入错误。
[*罕见的情况。在极少数情况下,小错误恰好为零。当你的浮点值是小整数或是2,1/2,1/4,1/8等幂的和的分数时,就会发生罕见的情况。在少数情况下,你的良性数与良性分数部分,错误将为零]
+1:在我看来是最全面的答案。 – gorsky 2010-03-03 11:44:04
当然,他们是不同的,因为如何浮点分割的作品。
>>> res = 0
>>> for x in xrange(5000): res += 0.1
...
>>> res == 5000 * 0.1
False
那么,如果k
分n
话,肯定第一个是更准确的:-)认真地说,如果划分浮点和n > 1
那么第一个会更精确,但无论如何他们可能会给出不同的结果,如nosklo说。
顺便说一句,在Python 2.6中,除法是默认情况下的整数,所以你会得到非常不同的结果。 1/k
将始终给出0,除非k <= 1
。
除非'k'是一个浮点数。 – 2010-03-03 04:03:48
浮点运算具有表示和舍入错误。对于数据类型的浮点数来表示,合理大小的实数,这些错误通常是可以接受的。
如果你想计算两个数的商,正确的方法是简单地说result = n/k
(注意,如果这些都是整数,你没有说from __future__ import division
,这不是你所期望的)。第二种方式很愚蠢,容易出错,而且很丑。
有在Python教程浮点不精确的一些讨论:http://docs.python.org/tutorial/floatingpoint.html
即使我们假设宽厚一个浮点除法,有精密的差别是非常明确; for
循环执行n - 1
次!
assert (n-1)/k != n/k
也要看是什么res
被初始化为在第二种情况下:-)
当然,如果你使用浮点数,除非你使用的Python解释器/编译器能够优化掉循环(也许Jython或IronPython可能能够C编译器在这方面相当不错)。
如果你真的想要这两种方法是相同的精度虽然和你正在使用的整数您的分子和分母,您可以使用Python fractions包
from fractions import Fraction
n,k = 999,1000
res = Fraction(0,1)
for i in range(0,n):
res += Fraction(1,k)
print float(res)
- 1. 哪种方式更好地移动ImageView
- 2. 在java中哪种方式更好?
- 3. CSS - 哪种方法更好?
- 4. 哪种形式的初始化更好?
- 5. 哪种引用S3文件的方式更好/更快?
- 6. JavaScript对象的 - 私有方法:哪种方式更好
- 7. 为了得到方向,哪种方法更好?
- 8. 在C++编译时提供更好的方式提供库的路径
- 9. 哪种方法更好,更安全?
- 10. 从创建数组列表 - 3种方式哪种更好
- 11. python - 哪种更好的方式来启用/禁用日志记录?
- 12. 在php或mysql中相同的结果,哪种方式更好?
- 13. C++ 11是否提供了一种更好的方式来动态连接字符串?
- 14. 一种更好的方式提交表单Django的
- 15. 哪种方式更好地调用这个id生成方法?
- 16. 在Odoo 7中调用ORM方法哪种方式更好?
- 17. 为了提高Tesseract精度
- 18. 哪种转换方法更好?
- 19. 哪种方法更好,为什么?
- 20. ICallbackEventHandler,HttpHandler,XMLHttpRequestObjext - 哪种方法更好
- 21. 哪种方法更好? libsvm或svmclassify?
- 22. 哪种方法布局更好?
- 23. setter验证:哪种方法更好?
- 24. 哪种方法可变设置更好?
- 25. 关联范围 - 哪种方法更好?
- 26. 哪种方式更好地调用函数静态方式或对象方式?
- 27. 推送通知 - 哪种方式最好?
- 28. 提交按钮图片 - 哪种方式最好?
- 29. 将图像放入图形上下文的两种方式 - 哪种更好?
- 30. python:更好的方法来提取匹配的模式?
是否有实际的动机这个询问? – 2010-03-03 04:04:19
应该是'范围(0,n)',不是?假设'res = 0' – Anycorn 2010-03-03 04:07:31
'range(n)',你甚至可以说。 – 2010-03-03 06:36:46