请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
最近,一位记者提到float.as_integer_ratio()了Python 2.6中的新内容,指出典型的浮点实现基本上是实数的有理近似.好奇,我不得不尝试π:
>>> float.as_integer_ratio(math.pi);
(884279719003555L, 281474976710656L)
Run Code Online (Sandbox Code Playgroud)
(428224593349304L, 136308121570117L)
Run Code Online (Sandbox Code Playgroud)
例如,这段代码:
#! /usr/bin/env python
from decimal import *
getcontext().prec = 36
print "python: ",Decimal(884279719003555) / Decimal(281474976710656)
print "Arima: ",Decimal(428224593349304) / Decimal(136308121570117)
print "Wiki: 3.14159265358979323846264338327950288"
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
python: 3.14159265358979311599796346854418516 Arima: 3.14159265358979323846264338327569743 Wiki: 3.14159265358979323846264338327950288
当然,考虑到64位浮点数提供的精度,结果是正确的,但它让我问:我怎样才能找到更多有关实现限制的结果 as_integer_ratio()?谢谢你的指导.
其他链接:Stern-Brocot树和Python源代码.