-1

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

我为解决它所做的是:

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

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

所以在号码 -123123.2323 的情况下,我收到了号码:

(十六进制) c7 f0 79 9d

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

尾数= 1110000011110011 0011101

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

尾数= 1110000011110011 0011110

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

4

2 回答 2

1

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

于 2018-06-19T13:20:46.450 回答
0

好吧,这并不是我的程序或解决方案有问题,只是我的思考过程,我缺乏关于浮点数的关键信息。

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

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

于 2018-06-19T16:28:15.120 回答