[英]How does Python convert floats to strings internally?
在Python 的文档的一部分中,有一部分说:
有趣的是,有许多不同的十进制数共享相同的最接近的近似二进制分数。 例如,数字
0.1
和0.10000000000000001
和0.1000000000000000055511151231257827021181583404541015625
都近似为3602879701896397 / 2 ** 55
由于所有这些十进制值共享相同的近似值,因此可以显示它们中的任何一个,同时仍保留不变的eval(repr(x)) == x
。 从历史上看,Python 提示和内置的repr()
函数会选择具有 17 个有效数字的0.10000000000000001
,0.10000000000000001
。 从 Python 3.1 开始,Python(在大多数系统上)现在能够选择其中最短的并简单地显示0.1
。
据我了解,这意味着当 Python 将浮点数转换为字符串时,它会选择与近似时的内部表示完全相等的最短字符串。 我试图通过查看 CPython 源代码来弄清楚它是如何做到这一点的,但我得到的最远的是:
static PyObject *
float_repr(PyFloatObject *v)
{
PyObject *result;
char *buf;
buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
'r', 0,
Py_DTSF_ADD_DOT_0,
NULL);
if (!buf)
return PyErr_NoMemory();
result = _PyUnicode_FromASCII(buf, strlen(buf));
PyMem_Free(buf);
return result;
}
PyOS_double_to_string
函数对我来说实际上是一个PyOS_double_to_string
——它被记录在案,但我不知道它是在哪里定义的。 所以...
一些注意事项以查看“0.1”附近的确切值,以帮助加深对 OP 问题的理解。
A next lower float ..... 0.09999999999999999167_332731531132594682276248931884765625
B average A,C .......... 0.09999999999999999861_2221219218554324470460414886474609375
C nearest float to "0.1" 0.10000000000000000555_11151231257827021181583404541015625
D C to 17 places ....... 0.10000000000000001
E average C,F .......... 0.10000000000000001249_0009027033011079765856266021728515625
F next upper float ..... 0.10000000000000001942_890293094023945741355419158935546875
B、E 之间的所有十进制值近似为 3602879701896397 / 2 ** 55。这包括: 0.1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.