floating-point - 最大的非规范化和规范化数是多少?(64 位,IEEE 754-1985)

标签 floating-point binary floating-accuracy ieee-754 denormalization

我正在为浮点运算而苦苦挣扎,因为我真的很想了解这个话题!

我知道数字可以用科学记数法表示。

因此,对于这两个数字,指数应如下所示:

非规范化数:
11....11 所以 (1+1/2 + 1/2^2 + ... + 1/2^52)*2^1023

标准化数:
11....11 所以 (1+1/2 + 1/2^2 + ... + 1/2^52)*2^1024

但是,我不确定这是否正确?

我真的很感激你的回答!

PS。:在维基百科上的数字是given!然而,我不知道他们是怎么想出来的……

最佳答案

如您所知, double 格式如下所示:

enter image description here

理解非规范化数字的关键在于它们实际上并不是浮点数,而是使用定点微格式使用“正常”格式中未使用的表示。

普通浮点数的形式为:m*2^e哪里e通过从上面的指数场中减去偏差得到,m是一个介于 1 和 2 之间的数字,其中“二进制”点之后的位由上面的分数给出。二进制小数点前面的 1 不存储,因为已知它始终为 1。指数字段的值从 1 到 2046。值 0(全为零)和 2047(全为 1)保留用于特殊用途.

指数字段中的所有 1 表示我们有无穷大或 NaN(非数字)。

全零意味着我们正在处理非正规浮点数。这些仍然是相同的形式,m*2^e ,但 m 的值和 e是不同的派生出来的。 m现在是一个介于 0 和 1 之间的数字,因此二进制小数点前面有一个 0,而不是普通数字的 1。 e始终具有相同的值:-1022。所以指数是一个常数,这就是我之前称它为定点格式的原因。

因此,每个的最大可能值是:

  • 正常:(1+1/2 + 1/2^2 + ... + 1/2^52)*2^1023 = (2-2^-52)*2^1023 = 1.797...e+308
  • 非正规:(0+1/2 + 1/2^2 + ... + 1/2^52)*2^-1022 = (1-2^-52)*2^-1022 = 2.225...e -308
  • 关于floating-point - 最大的非规范化和规范化数是多少?(64 位,IEEE 754-1985),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20065406/

    相关文章:

    ios - Swift - 如果小数等于 0,如何从 float 中删除小数?

    Javascript将字符串转换为固定长度的二进制

    java - 如何使用java的ResultSet获取mysql的float的精确值

    c - 如何避免单元测试中的浮点舍入错误?

    c++ - 将浮点除法分解为整数和小数部分

    c - 删除 ascii float 中的小数点而不截断或精度损失

    java - Java中float和double的包含范围是多少?

    python - Python 中的机器 Epsilon

    java - 使用 Java 将 Base64 转换为二进制

    go - 从指数和尾数创建 float