解析字符串以使其浮动的python标准是什么?

时间:2019-04-03 01:08:47

标签: python floating-point

对于相对简单的浮点,数值精度足以准确地表示它们。例如17.5等于17.5

对于更复杂的浮点数,例如

17.4999999999999982236431605997495353221893310546874 = 17.499999999999996447286321199499070644378662109375
17.4999999999999982236431605997495353221893310546875 = 17.5

在上面的第一个数字上使用as_integer_ratio(),可以得到(4925812092436479, 281474976710656),并且由于(4925812092436479*2+1)/(2*281474976710656)等于上面的第二个数字,因此显然> = 17.5和<17.5之间的分区是1 /( 2 * 281474976710656)。

python标准是否保证特定的float将被“绑定”到上面的特定bin中,还是依赖于实现?如果有保证,如何确定?

对于上述情况,我使用的是python 3.5.6,但我对python 3.x的一般答案感兴趣(如果存在)。

3 个答案:

答案 0 :(得分:2)

  

对于相对简单的浮点数,数值精度足以准确地表示它们

不是。是的, 17.5 可以精确表示,因为它是2的幂的倍数(准确地说是2 -1 的倍数)。但是,即使像 0.1 这样的非常简单的浮点数也无法准确表示。在那里,要依靠浮点转换例程来获取尽可能接近的表示形式。

转换是由运行时(或编译器的C或Java运行时,对于文字)完成的,运行时使用C或Java函数(如C的 strtod())进行此操作( Java使用David Gay的 strtod()代码,但使用Java语言)。

不是 strtod()的每个实现,即不是每个C / Java编译器都使用相同的方法进行转换,因此某些结果中可能存在细微的差异,通常微不足道< / strong>。


FWIW,Exploring Binary网站(无从属关系,我只是一个忠实拥护者)上有许多关于此主题的文章。显然,它并不像预期的那么简单。

答案 1 :(得分:1)

  

对于相对简单的浮点数,数值精度足以准确地表示它们。

不,即使是简单的小数也不一定具有精确的IEEE-754表示形式:

>>> format(0.1, '.20f')
'0.10000000000000000555'
>>> format(0.2, '.20f')
'0.20000000000000001110'
>>> format(0.3, '.20f')
'0.29999999999999998890'
>>> format(0.1 + 0.2, '.20f')
'0.30000000000000004441'

2的幂(x.0,x.5,x.25,x.125,…)是模数精度问题。

  

python标准是否保证特定的float将被“绑定”到上方的特定bin中,还是依赖于实现?

可以肯定的是,Python只是委派给基础系统,因此它主要取决于硬件。如果需要担保,请使用decimal。 IIRC的本机(C)实现在3.3中进行了合并,因此使用小数对性能的影响已大大低于Python 2。

答案 2 :(得分:0)

Python浮点数为IEEE-754 doubles