IEE754 - 浮点数表示法

IEE754 - Floating point number representation

我正在编写程序,它从输入中获取浮点数并输出该数字的十六进制表示。

我解决它的方法是:

  1. 将数字除以整数和小数部分。
  2. 将整数和小数部分转换为二进制表示。 a) 整数除以 2,如果 mod2 ==1,则加 1,否则加 0。将整数翻转过来。 b) 小数部分乘以2,如果大于1,减1,再做一次。
  3. 如果数字小于0,则符号为1,否则符号为0。
  4. 获取指数 (127+/-x),将其转换为二进制(整数)。
  5. 获取尾数。
  6. 将符号+指数+尾数转换为十六进制。

我的程序正在通过 SPOJ 论坛上的所有测试。我不得不寻找自己失败的手动测试用例。

所以如果号码是 -123123.2323,我收到的号码是:

(十六进制)c7 f0 79 9d

二进制整数=11110000011110011 二进制小数=0011101101111000000000 ....

尾数=11100000111100110011101

同时 https://www.h-schmidt.net/FloatConverter/IEEE754.html 给我:

尾数=11100000111100110011110

它是如何工作的,在那种情况下为什么会这样?当我将 0.2323 转换为二进制时使用 https://www.rapidtables.com/convert/number/decimal-to-binary.html?x=0.2323 得到 0.0011101101111。我用这部分在添加整个二进制数 (-1) 后完成尾数,最多 23 位。我做错了什么?

0.2323 和 -123123.2323 不完全等于任何 IEEE-754 浮点数。您用来将其转换为二进制浮点表示的任何内容都需要选择要使用的精度,以及将其四舍五入的方向。看起来您使用的各种东西使这些选择有所不同。

好吧,这并不是我的程序或解决方案有误,只是我的思考过程和我缺少有关浮点数的重要信息。

正如"chux"先生所说,我试图计算的数字(-123123.2323)应该被计算机读取为其他数字(-123123.2344)。由于我使用字符串作为输入并将数字简单地分为整数和小数部分,因此我看不到浮点数的限制。

解决方案是将数字读取为浮点数,让计算机更改它的值,然后将其读取为字符串并使用它。