python标准是什么,通过它将字符串解析为float?

2024-04-16 15:06:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

对于更复杂的浮动,例如

17.4999999999999982236431605997495353221893310546874 = 17.499999999999996447286321199499070644378662109375
17.4999999999999982236431605997495353221893310546875 = 17.5

在上面的第一个数字上使用as \u integer \u ratio(),得到(4925812092436479, 281474976710656),由于(4925812092436479*2+1)/(2*281474976710656)等于上面的第二个数字,>;=17.5和<;17.5之间的分区显然是1/(2*281474976710656)。你知道吗

python标准是否保证特定的float将被“装箱”到上面的特定bin中,或者它依赖于实现?如果有担保,如何决定?你知道吗

对于上面的内容,我使用了python3.5.6,但是我对python3.x的一般答案感兴趣,如果它存在的话。你知道吗


Tags: ltgt内容标准binas精度数字
3条回答

For relatively simple floats, the numerical precision is sufficient to represent them exactly.

不,即使是简单的小数也不一定有准确的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,…)是精确表示的模精度问题。你知道吗

Do the python standards guarantee a particular float will be "binned" into a particular bin above, or is it implementation dependent?

很确定Python只是简单地委托给底层系统,所以它主要依赖于硬件。如果需要保证,请使用decimal。IIRC本机(C)实现在3.3中被合并,因此使用小数对性能的影响比Python2要小得多。你知道吗

For relatively simple floats, the numerical precision is sufficient to represent them exactly

不是真的。是的,17.5可以精确表示,因为它是2的幂的倍数(确切地说是2的倍数)。但即使是非常简单的float,如0.1也不能精确表示。在那里,它依赖于文本到浮点的转换例程来获得尽可能接近的表示。你知道吗

转换是由运行时(或编译器的C或Java运行时,对于文本)完成的,它使用C或Java函数(如C的strtod())来完成(Java实现了David Gay的strtod()的代码,但使用Java语言)。你知道吗

不是每个strtod()的实现,也就是说,不是每个C/Java编译器都使用相同的方法进行转换,因此在某些结果中可能存在细微的差异,通常是不显著的差异。你知道吗


FWIW,网站Exploring Binary(没有隶属关系,我只是个超级粉丝)有很多关于这个主题的文章。这显然不像预期的那么简单。

Python浮点是IEEE-754 doubles。你知道吗

相关问题 更多 >