python - 将 float 转换为 int 时,尾随数字从何而来?

标签 python floating-point

我知道 float 包含大量数字和一些基数的指数,通常是十。因此,超过有效数字的任何内容都不会准确,因为那里什么也没有,但是当将 float 转换为 int(或 long)时,会出现虚假数字。

这是一个 Python 示例:

>>> int(1e308)
100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336L

当一遍又一遍地赋予相同的值时,它们似乎并没有改变,所以它可能不是完全随机的,也不是从内存中的某个神秘点拉出来的。这些随机数字从何而来?产生这些尾随数字到底发生了什么?为什么转换不简单地将随机数字设置为零?

最佳答案

它们不是随机的!并且转换确实将所有“随机”数字设置为零。只是不在十进制!

在 Python(2.6 及更高版本)中,您可以调用 .hex()在任何浮点值上更容易地看到它是如何存储的。使用 1e308,您将获得 '0x1.1ccf385ebc8a0p+1023'。在右侧,您会看到将左侧的十六进制值提高为输入值所需的 2 的幂。在二进制中,十六进制值为 1.00011100110011110011100001011110101111001000101

将它乘以 2^1023 只是将小数点移动了 1023 个位置

1000111001100111100111000010111101011110010001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

这正是 int(1e308)。从 float 到 integer 的转换只是简单地将小数点移动到基数 2,并丢弃其余部分。

关于python - 将 float 转换为 int 时,尾随数字从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42033918/

相关文章:

python cx_oracle 和服务器信息

模拟 TCP 套接字以进行单元测试的 Python 方法

Python 错误 : could not convert string to float

postgresql - 选择十进制形式的 float

c++ - double、long double、float 和 float128 的比较?

c++ - 如何使用cout以全精度打印 double 值?

python - IO错误 : [Errno 2] No such file or directory: 'README.md'

python - 删除列表中与其他列表中的匹配相对应的每个项目

python - Cloud9 Unicode 错误 - 导入系统不起作用

c++ - gcc '-m32' 选项在不运行 valgrind 时更改浮点舍入