对于相对简单的浮点数,数值精度足以精确表示它们。例如,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的一般答案感兴趣,如果它存在的话。你知道吗
不,即使是简单的小数也不一定有准确的IEEE-754表示:
2的幂(x.0,x.5,x.25,x.125,…)是精确表示的模精度问题。你知道吗
很确定Python只是简单地委托给底层系统,所以它主要依赖于硬件。如果需要保证,请使用
decimal
。IIRC本机(C)实现在3.3中被合并,因此使用小数对性能的影响比Python2要小得多。你知道吗不是真的。是的,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。你知道吗
相关问题 更多 >
编程相关推荐