繁体   English   中英

Python如何在内部将浮点数转换为字符串?

[英]How does Python convert floats to strings internally?

Python 的文档的一部分中,有一部分说:

有趣的是,有许多不同的十进制数共享相同的最接近的近似二进制分数。 例如,数字0.10.100000000000000010.1000000000000000055511151231257827021181583404541015625都近似为3602879701896397 / 2 ** 55 由于所有这些十进制值共享相同的近似值,因此可以显示它们中的任何一个,同时仍保留不变的eval(repr(x)) == x 从历史上看,Python 提示和内置的repr()函数会选择具有 17 个有效数字的0.100000000000000010.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 ——它被记录在案,但我不知道它是在哪里定义的。 所以...

  1. 这个函数在哪里定义的?
  2. 它实际上有什么作用

一些注意事项以查看“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM