precision - IEEE-754 单精度和 double 格式是如何确定的?

标签 precision ieee-754 design-decisions design-rationale

我对如何确定这些感兴趣:

  • 单精度有:e 的 8 位和其余的(23 位)是尾数
  • double :e 和其余的 11 位(52 位)是尾数
    ofc 有 1 位用于符号。

  • 那么它如何确定尾数的位数是多少,e 的位数是多少。我想这是一个菜鸟问题,但我想知道答案。

    最佳答案

    如果您为自己开发一种格式,那么您可以根据您需要更高的精度或更大的范围来决定指数和尾数的位数。由于 IEEE-754 是为一般用途而设计的,因此在大多数情况下他们必须选择更好的
    在 IEEE-754 之前,有许多具有不同优缺点的浮点格式,其中一些来自 DEC。最初 DEC 为他们的 VAX 系统创建了 32 位 F 和 64 位 D 格式,两者都有 8 位的指数来表示所有重要的物理常数,包括普朗克常数 (6.626070040 × 10-34) 和阿伏伽德罗常数(6.022140857 × 1023)。但是他们很快意识到这个数字非常有限,并且时不时会发生上溢/下溢,因此他们必须在指数上再增加 3 位以创建新的 64 位 G 格式。当 Kahan 博士撰写 IEEE-754 草案时,他 "suggested that DEC VAX's floating-point be copied because it was very good for its time"这就是为什么 IEEE-754 单精度和 double 在指数部分分别有 8 位和 11 位的原因
    64 位格式的另一个基本原理是允许重复乘法而不会溢出

    For the 64-bit format, the main consideration was range; as a minimum, the desire was that the product of any two 32-bit numbers should not overflow the 64-bit format. The final choice of exponent range provides that a product of eight 32-bit terms cannot overflow the 64-bit format — a possible boon to users of optimizing compilers which reorder the sequence of arithmetic operations from that specified by the careful programmer.

    "A Proposed Standard for Binary Floating-Point Arithmetic", David Stephenson, IEEE Computer, Vol. 14, No. 3, March 1981, pp. 51-62


    这与各种 DSP 具有更宽的累加器寄存器的原因相同,通常为 40 位,以允许将 32 位值相加 256 次而不会溢出
    事实上,现在 IEEE-754 交换格式的规则是指数的大小是 round(4 log2(k)) − 13 位,所以每次我们将类型的宽度加倍时,指数将有大约 4 位,这允许用于 16 次无溢出的较窄类型的乘法
    在 16 位半浮点格式中,如果仅使用 4 位作为指数,则由于范围太窄且最大值甚至比最大 16 位 int 值小得多,因此它们使用 5 位代替。半浮点数主要用于计算机图形,因此可能 11 位的精度就足够了,并且它们需要更大的指数以获得更宽的动态范围。
    更多详情请阅读 Where did the free parameters of IEEE 754 come from?

    关于precision - IEEE-754 单精度和 double 格式是如何确定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23064893/

    相关文章:

    math - float 学坏了吗?

    c++ - 返回浮点类型是否完全符合 IEEE-754 的函数?

    javascript - 在javascript中的float <-> int之间转换

    java - 从访问器中抛出异常的错误设计决策?

    user-interface - 将手形光标用于按钮等可点击项目是错误的吗?

    c++ - std::set 没有前后成员函数是否有设计原因?

    gradle - 在gradle中解析double给出了意外的值

    c++ - 转换为科学计数法时出现 double 错误

    assembly - 如何实现浮点值的totalOrder谓词?

    c++ - std::isfinite(IntegralType) 可以返回 false 吗?