代码之家  ›  专栏  ›  技术社区  ›  vApor

为数据类型分配的默认内存在舍入中起作用吗?如果浮点超过分配的内存,则以何种方式舍入?

  •  0
  • vApor  · 技术社区  · 6 年前

    拥有文件test2。py,包括以下内容:

    print(2.0000000000000003)    
    print(2.0000000000000002)
    

    我得到以下输出:

    $ python3 test2.py  
    
    2.0000000000000004  
    2.0    
    

    我认为分配给float的内存不足可能会导致这种情况,但2.0000000000000003和2.0000000000000002需要相同的内存量。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Patricia Shanahan    6 年前

    IEEE 754 64位二进制浮点始终使用64位存储数字。它可以精确地表示 二进制的 分数。仅查看正常数字,如果 N 在其范围内是二的幂,它可以以二进制形式表示一个数, 1.s*N 哪里 s 是由52个0和1组成的字符串。

    所有32位二进制整数(包括2)都是可精确表示的。

    大于2的最小可精确表示数字为2.0000000000000004440892098500616169452667236328125。它是二进制分数1.0000000000000000000000000000000000000001的两倍。

    2.0000000000000003比2更接近2.0000000000000004440892098500616169452667236328125,因此它四舍五入并打印为2.0000000000000004。

    2.0000000000000002更接近于2.0,因此四舍五入为2.0。

    要存储介于2.0和2.00000000000000044408920988500626169452667236328125之间的数字,需要不同的浮点格式,每个数字可能需要64位以上。

        2
  •  0
  •   Patrick Artner    6 年前

    浮点数不存储为整数,每一位表示1,2,4,8,16,32…的是/否项,。。。值,将其相加以获得完整的数字。它们存储为 sign + mantissa + exponent 在base 2中。有几种组合具有特殊含义(NaN、+-inf、-0、…)。正数和负数在尾数和指数上是相同的,只是符号不同。

    在任何特定的时间 a specific bit-length 它们被“放入”。它们不能溢出。

    然而,它们的精度很低,如果你试图将数字拟合到它们中,那么需要更高的精度,你就会得到舍入误差——这就是你在例子中看到的。

    有关浮动和存储的更多信息(附示例):

    有关浮动精度的更多信息: - Floating Point Arithmetic: Issues and Limitations