我正在为浮点运算而苦苦挣扎,因为我真的很想了解这个话题!
我知道数字可以用科学记数法表示。
因此,对于这两个数字,指数应如下所示:
非规范化数:
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 格式如下所示:
理解非规范化数字的关键在于它们实际上并不是浮点数,而是使用定点微格式使用“正常”格式中未使用的表示。
普通浮点数的形式为: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。所以指数是一个常数,这就是我之前称它为定点格式的原因。
因此,每个的最大可能值是:
关于floating-point - 最大的非规范化和规范化数是多少?(64 位,IEEE 754-1985),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20065406/