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

将非常大的int值转换为double,在某些计算机上会丢失精度

  •  2
  • Thor  · 技术社区  · 7 年前

    对于一个非常大的int,我们(对于某些计算机)可能会损失

    但没有提供声明的理由。

    2 回复  |  直到 7 年前
        1
  •  6
  •   eerorika    7 年前

    假设浮点数使用N位存储。

    浮点数应该能够表示小数。然而,由于所有的位都用来表示整数,所以剩下的零位表示任何小数。这是一个矛盾,我们必须得出结论,认为float可以精确地将所有整数表示为大小相等的整数类型的假设肯定是错误的。

    由于在N位整数的范围内必须存在不可表示的整数,因此如果转换的值恰好是其中一个不可表示的值,则将该整数转换为N位的浮点值可能会丢失精度。


    现在,由于浮点可以表示有理数的子集,所以其中一些可表示的值可能确实是整数。特别是,IEEE-754规范保证了二进制双精度浮点可以表示最大为2的所有整数 . 此属性与 尾数

    因此,在符合IEEE-754的系统上转换为double时,不可能丢失32位整数的精度。


    更严格地说,x86体系结构的浮点单元实际上使用80位扩展浮点格式,这种格式被设计成能够精确地表示所有64位整数,并且可以使用 long double 类型。

        2
  •  6
  •   Juraj Blaho    7 年前

    如果 int double 也是64位的。浮点数由尾数(表示数字)和指数组成。作为结尾 双重的 在这种情况下,比特数比 ,则double能够表示较少的数字,并且会发生精度损失。

    推荐文章