Python 将浮点转换为整数时,尾随数字来自何处?

Python 将浮点转换为整数时,尾随数字来自何处?,python,floating-point,Python,Floating Point,我知道浮点数包含大量的数字和一些基数的指数,通常是10。因此,任何超过有效位的内容都不会准确,因为没有任何内容,但当将浮点转换为int(或long)时,会出现伪数字 下面是一个Python示例: >>> int(1e308) 10000000000000000109790636294404554174049230967731184633681068290315758540491149153716332897849468889906124966972117251561159028

我知道浮点数包含大量的数字和一些基数的指数,通常是10。因此,任何超过有效位的内容都不会准确,因为没有任何内容,但当将浮点转换为int(或long)时,会出现伪数字

下面是一个Python示例:

>>> int(1e308)
100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336L

当一次又一次地给出相同的值时,它们似乎不会改变,所以它可能不是完全随机的,也不是从记忆中的一个神秘点提取出来的。这些随机数字来自哪里?到底是什么产生了这些尾随数字?为什么转换不简单地将随机数字设置为零?

它们不是随机的!转换会将所有“随机”数字设置为零。只是不在10垒

在Python(2.6及更高版本)中,您可以调用任何浮点值以更容易地查看其存储方式。使用
1e308
,您将获得
'0x1.1ccf385ebc8a0p+1023'
。在右边,您将看到需要2的幂来提升左边的十六进制值,使其成为输入的值。在二进制中,十六进制值为
1.00011001111001110000101111111001000101

将其乘以2^1023,只需将基数点移动1023个位置即可

1000111001100111100111000010111101011110010001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
正是
int(1e308)
。从浮点到整数的转换只是简单地移动基数2中的基点,并删除其余的