0

我知道将一些数字从二进制转换为浮点时可能会出现问题。

例如:1.4 结果为 1.39999。6.2 是 6.1999999,6.6 是 6.599999,等等。

有没有办法计算哪些数字会导致这些问题?就像创建某种电子表格或数据库,其中的数字从 1 到 50,000 不完全转换?

4

2 回答 2

1

浮点计算中的错误根源于浮点数的存储方式。取决于您使用的精度(通常是单精度(浮点)或双精度)。双精度浮点数占用更多空间,但精度大约是其两倍。

浮点数通常以 IEEE 格式存储,因此仅包括最高有效位。

在以这种方式存储以表示浮点数的一串位中,有不同的部分组成该数字。首先,有一个符号位指示数字是正数还是负数。接下来,存储数字的指数部分(在单精度浮点数中,这需要 8 位)。在指数之后,所有剩余的位代表数字的有效数字。因此,位 1 10000000 01000000000000000000000 表示 -0.5 符号位(第一个)表示该数字为负数。接下来的八位是指数。通常,指数存储时带有偏差,因此除了大数字之外,还可以精确存储小数字。为此,用于计算的指数是 -127(如果是 8 位指数)+ 解释为整数的指数位(在我们的例子中是 128)。

再举个例子,这里有一个转换器,它使用复选框来指示位。在最坏的情况下,您可以编写一个机器人来测试您关心的所有组合。

一般来说,如果不能用不是直接由 2 的幂的组合组成的分数来描述,则将其四舍五入。(如果你不能用 1/2 + 1/4 + 1/8 等得到它。它可能会被四舍五入)

于 2013-02-04T14:41:41.447 回答
0

几乎所有的数字都很麻烦。次要的例外是,当反复乘以 2 时,会去掉小数部分并最终小于 2^24。

例如

0.125 -> 0.25 -> 0.5 -> 1.0 !  OK
6.4 --> 12.8 --> 25.6 -> 51.2 -> 102.4 : we got a cycle! (.4 .8 .6 .2 ... )

编辑

鉴于问题的目的/背景,当浮点数四舍五入为零时,不精确性似乎会造成麻烦。

例如

10.2 == 10.199999809, when the next floating point would be  
next == 10.200000763  <-- the difference to the wanted value is ~4 times higher
vs.
10.3 == 10.300000197, when the previous (rounded down fp would be)
prev == 10.299992370, <-- this would have been also ~4x further from away

也许是时候和 CNC 驱动程序的程序员谈谈了……

于 2013-02-04T14:40:18.070 回答