将浮点数1864.78转换为二进制和IEEE格式

时间:2016-02-15 00:50:19

标签: c binary floating-point ieee-754

我一直在尝试将S& P 500的值(现在为1864.78)转换为内存中以IEEE单精度格式表示的值。

转换小数点左边(1864)很容易。

11101001000。

但是如何获得小数的二进制表示(.78)?我尝试使用这种技术但它在8位指数IEEE格式上产生了许多数字:

.78 * 2 = 1.56 1

.56 * 2 = 1.12 1

.12 * 2 = .24 0

.24 * 2 = .48 0

.48 * 2 = .96 0

.96 * 2 = 1.92 1

.92 * 2 = 1.84 1

.84 * 2 = 1.68 1

.68 * 2 = 1.36 1

.36 * 2 = .72 0

.72 * 2 = 1.44 1

.44 * 2 = .88 1(四舍五入,因为现在我们总共有23位)

11101001000.110001111011 =尾数23位

为标志添加0

0 11101001000.110001111011

现在我需要将小数移动10个位置

1.1101001000110001111011 x 2 ^ 10指数现在是10

添加0位以使全尾数23位

1.11010010001100011110110

指数为10,因此10 + 127 = 137

等于10001001

so 0 10001001 11010010001100011110110,这是一个32位数字。

这看起来像一个体面的方法吗?我测试了这个值并写下了这个问题,我实际上可以自己完成它。

用此测试十进制FP。 http://www.h-schmidt.net/FloatConverter/IEEE754.html

2 个答案:

答案 0 :(得分:8)

您有两种不同的转换例程,用于将整数和小数部分转换为二进制。您了解如何将1864转换为二进制文件,但在将.78转换为二进制文件时遇到问题。 注意:您必须将内存中的实际分数转换为1864.78或分数1864.780029 0.780029不是 0.78。这似乎是你的"舍入"困惑来自。

要将分数转换为其二进制表示,您将将分数乘以2,如果结果数的整数部分大于1,则该位的二进制表示为{{1如果不是你的代表是1。如果大于1,则从数字中减去0并重复,直到您用完该数字或达到相关精度限制。例如:

1

注意: 浮点小数值将如何趋​​向于零,而不是达到您的数字限制。如果您尝试将number : 1864.78 float : 1864.780029 (actual nearest representation in memory) integer : 1864 fraction : 0.780029 2 * 0.780029 = 1.560059 => integer part (1) fraction (0.560059) => '1' 2 * 0.560059 = 1.120117 => integer part (1) fraction (0.120117) => '1' 2 * 0.120117 = 0.240234 => integer part (0) fraction (0.240234) => '0' 2 * 0.240234 = 0.480469 => integer part (0) fraction (0.480469) => '0' 2 * 0.480469 = 0.960938 => integer part (0) fraction (0.960938) => '0' 2 * 0.960938 = 1.921875 => integer part (1) fraction (0.921875) => '1' 2 * 0.921875 = 1.843750 => integer part (1) fraction (0.843750) => '1' 2 * 0.843750 = 1.687500 => integer part (1) fraction (0.687500) => '1' 2 * 0.687500 = 1.375000 => integer part (1) fraction (0.375000) => '1' 2 * 0.375000 = 0.750000 => integer part (0) fraction (0.750000) => '0' 2 * 0.750000 = 1.500000 => integer part (1) fraction (0.500000) => '1' 2 * 0.500000 = 1.000000 => integer part (1) fraction (0.000000) => '1' (在32位浮点值中无法精确表示为0.78),您将在第12位进行不同的转换。

将小数部分转换为二进制后,可以继续转换为IEEE-754单精度格式。 e.g:

1864.78

偏差指数的归一化是:

decimal  : 11101001000
fraction : 110001111011
sign bit : 0

转换为隐藏位'格式形成尾数:

 11101001000.110001111011  =>  1.1101001000110001111011

     exponent bias: 10
 unbiased exponent: 127
 __________________+____

   biased exponent: 137
   binary exponent: 10001001

然后使用符号位 + 多余的127指数 + 尾数来形成IEEE-754单精度表示:

1.1101001000110001111011  =>  1101001000110001111011

仔细看看,如果您有其他问题,请告诉我。如果您想要一个简单的例程来填充带有结果转换的字符数组,您可以执行类似于以下操作的操作,将浮点部分转换为二进制:

IEEE-754 Single Precision Floating Point Representation

  0 1 0 0 0 1 0 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 1 1 0
 |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
 |s|      exp      |                  mantissa                   |

答案 1 :(得分:1)

你的1位太短:IEEE754二进制32格式使用24位有效数字,但使用23位存储隐含前导1。

所以后两位是:

0.44*2=0.88 0           => 1
0.88*2=1.76 2 (rounded) => 0 (carry the extra bit)

给出数字

1.11010010001100011110110 2 ×2 10

您已经计算了偏差指数(137 = 10001001 2 ),因此可以直接构造结果位模式:

0 10001001 11010010001100011110110