【问题标题】:Convert from large decimal number into floating point representation从大十进制数转换为浮点表示
【发布时间】:2013-11-04 22:49:02
【问题描述】:

我想我知道如何将十进制数转换为 IEEE 754 单精度浮点表示,但我想确定一下。

我想在 IEEE 754 单精度浮点表示中表示 3.398860921 x 10^18。我知道如何浮动代表。坏了。

第 31 位:符号(0 表示 +,1 表示 -) 第 30-23 位:代表指数 第 22-0 位:表示尾数(有效位)

所以符号显然是 0,因为它是一个正数。对于指数,我想出了这个(通过将 18 添加到 127 的偏差)并将指数表示为:1001 0001

对于尾数,即 3.398860921 部分,我不断地将小数点右侧的所有内容乘以 2,如果大于 1,则标记为 1,否则标记为 0。然后取新答案并再次相乘小数点右边的所有内容都加 2,直到我想出足够的位来填充尾数。

所以现在我有: 0 | 1001 0001 | 0110 0110 0001 1011 1011 111

所以当我将其转换为十六进制时,我得到 0x48B30DDF,但这与我在 3.398860921 x 10^18 中开始时的数字不同

应该是这样还是我在某个地方犯了错误?任何帮助将不胜感激。

【问题讨论】:

  • 为什么要“加 18”?指数是二的幂,而不是十的幂。
  • 如果您只需要对实际上是整数的数字执行此操作,那么首先获取十进制整数字符串表示,将其转换为二进制,然后将二进制数打包成浮点数可能会更容易。
  • 1) 那么我应该添加什么而不是 18 到 127 呢? 2)那么您的意思是“3.398860921000000000”并将其转换为二进制吗?
  • 1) 要添加的正确内容是二进制值需要移动的位数才能将其转换为 1.xxxx 形式。 2) 见 Pascal Cuoq 的回答。

标签: floating-point decimal single-precision


【解决方案1】:

您不能将十进制指数用于 IEEE 754 表示。 IEEE 754 需要一个二进制指数,即数字 p 当数字表示为 1.xxx… * 2p.

你不能使用从十进制科学计数法直接转换为二进制的尾数是什么,因为它只对十进制指数有意义,你不能直接使用。

该算法是将整个数字转换为二进制,然后,然后,仅对于有效位,取前导位后面的 23 位。对于指数,计算前导位的位置。

对于您的特定值 3.398860921 x 1018,根据Wolfram Alpha,二进制表示为 1.0111100101011001011011111111111101101001010010111101×261。

这意味着无偏指数是61,省略了前导位的暂定有效数是01111001010110010110111。您可以计算从十进制到浮点的转换误差为 0.0000000000000000000000011111111101101001010010111101×261,并且由于此误差大于 ULP 的一半,除非您有理由更喜欢向下舍入,在有效位上加一,以获得与原始数字最接近的单精度值,以十进制表示。

【讨论】:

  • 那么我会用 127-61 来计算指数吗?我仍然感到困惑。我得到的最终答案是:0 | 0100 0000 | 1011 1100 1010 1100 1011 1111 对吗?
  • 答案是 0x5e3cacb8,假设四舍五入。您需要将偏差添加到无偏指数,得到十进制 188,二进制 10111100。指数的 LSB 是第三个十六进制数字的 MSB。其余位 1011110,前面是零符号位,形成前导 0x5e。四舍五入将有效数字加 1,从 01111001010110010110111 到 01111001010110010111000,0x3CACB8。
猜你喜欢
  • 2011-08-11
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2010-12-08
相关资源
最近更新 更多