【问题标题】:What's the least (negative) integer value that can be exactly represented by Double type in all major x86 systems?在所有主要的 x86 系统中,可以用 Double 类型精确表示的最小(负)整数值是多少?
【发布时间】:2011-04-10 21:58:38
【问题描述】:

在所有主要的 x86 系统中,可以用 Double 类型精确表示的最小(负)整数值是多少?尤其是在(同时)JVM、MySQL、MS SQL Server、.Net、PHP、Python 和 JavaScript(无论它使用什么相应的类型)。

我之所以问这个问题是因为我想选择一个值来表示错误(在无法成功计算的情况下从函数返回)——这就是为什么我需要一个准确的值对于精确的相等性检查是 100% 可预测的。异常(try-catch)似乎工作得慢得多——这就是我需要这样一个东西的原因。

【问题讨论】:

    标签: types floating-point double


    【解决方案1】:

    您的大多数语言和数据库产品都将使用 IEEE 标准 754 单曲和双曲。在 C 和 C++ 中,您可以使用单扩展格式和双扩展格式,但这些是体系结构相关的格式。您的高级、平台中立语言和数据库可能会避免暴露这些。

    根据 IEEE 标准 754,您忽略了 double 可以存储 Infinity 和 -Infinity 以及 NaN 的情况:

    • 最大正常数:1.7976931348623157e+308
    • 最小正正常数:2.2250738585072014e-308
    • 最大次正常数:2.2250738585072009e-308
    • 最小正亚正常数:4.9406564584124654e-324

    对于 x86 双扩展格式:

    • 最大正常 1.18973149535723176505e+4932
    • 分钟阳性正常:3.36210314311209350626e-4932
    • 最大低于正常值:3.36210314311209350608e-4932
    • min 正亚正常:3.64519953188247460253e-4951

    结果是双重拥有:

    • 有效数字(二进制​​):53
    • 最小正法线数:2.225... 10-308
    • 最大正数 1.797... 10308
    • 有效数字(十进制):15-17

    双重扩展 (x86) 具有:

    • 有效数字(二进制​​):64
    • 最小正法线数:3.362... 10-4932
    • 最大正数 1.189... 104932
    • 有效数字(十进制):18-21

    【讨论】:

    • 我认为如此大的数值并不能准确表示。我问这个问题的原因是因为我想选择一个值来表示错误(在无法成功计算的情况下从函数返回) - 这就是为什么我需要一个确切的值是 100 % 可预测的精确相等性检查。
    • @adam-goode,这是我首先想到的,我试过了。我不记得具体是怎么回事了,但被 Scala(我使用的主要语言)编译器拒绝了。
    • 我通常会指出“你做错了”在 double 中使用 unqiue 值来表示特殊的东西。 :-) 虽然当我写了很多 C 时,我会在查找 ID 时返回 -1 表示未找到。这些天我喜欢我的结构化编程语言,在那里我可以抛出异常或只返回一个元组或一个输出参数或一个包含值和状态代码的结构/类。
    • @zac-bowling,我明白,这对我来说似乎是一个肮脏的黑客行为。但是异常似乎工作得慢得多,我真的需要闪电般快速的错误处理并且不能承受任何显着的时间开销(因为 1. 这是一个数字处理任务,2. 这种拒绝功能经常发生并且通常是串联的) .
    • @zac-bowling,同时,使用元组而不是简单的 Double 并使用专用的 fiekd 来指示错误似乎更脏,恕我直言。这将违反“奥卡姆剃刀”。
    【解决方案2】:

    double(根据 IEEE 754)具有 52 位尾数 + 1 个最高有效尾数位,未以自身格式表示(因为对于标准化数字,该位始终 ==1)。
    所以 max int 完全可以表示为 double 是 (2^53-1),min one 是 -(2^53-1), 大约 +- 8 万亿(或长规模数字命名系统中的台球)

    【讨论】:

      【解决方案3】:

      在squeak Smalltalk中,我们有这个方法

      maxExactInteger
          "Answer the biggest integer such that it is exactly represented in a float, and all smaller integers also are"
          ^1 bitShift: self precision
      

      双精度为 53(包含隐含的 53 位尾数)。 是的,当然,2^53 是精确表示的,所有较小的正整数也是如此,但 2^53+1 不是,它需要 54 位,并且会四舍五入为 2^53...

      负数也一样,最少是 -2^53(IEEE 754 浮点表示中没有 2-complement 技巧,只是一个符号位)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 2023-03-19
        • 2010-12-21
        相关资源
        最近更新 更多