我知道将某些数字从二进制转换为浮点时可能存在问题。
例如:1.4结果为1.39999。 6.2是6.1999999,6.6是6.599999等。
有没有办法计算哪些数字会导致这些问题?比如使用1-50,000的数字创建某种电子表格或数据库,这些数字不能完全转换?
答案 0 :(得分:1)
浮点计算中的错误源于浮点数的存储方式。取决于您使用的精度(通常是单精度(浮点)或双精度)。双精度浮子占用更多空间,但精度大约是其两倍。
浮点数通常以IEEE格式存储,因此仅包含最高有效位。
在以这种方式存储以表示浮点数的一串位中,存在包含该数字的不同部分。首先,有一个符号位表示该数字是正数还是负数。接下来,存储数字的指数部分(在单精度浮点数中,这需要8位)。在指数之后,所有剩余的比特代表该数字的有效数字。因此,位1 10000000 01000000000000000000000表示-0.5符号位(第一个)表示该数字为负。接下来的八位是指数。通常,指数以偏差存储,以便除了大数字之外还可以精确地存储小数字。为此,用于计算的指数是-127(如果是8位指数)+指数位被解释为整数(在我们的例子中是128)。所有剩余的位表示从一个位置开始并从那里向右移动的数字的有效数字我们每次将值减半(1是1,但01是1/2,001是1/4)在我们的情况下总数为-0.5(符号位为-1,指数为2 ^ 1,其余位为0.5)
再例如,here是一个使用复选框来指示位的转换器。在最坏的情况下,您可以编写一个机器人来测试您关心的所有组合。
一般情况下,如果不能用直接由2的幂组合组成的分数来描述,则它将被舍入。 (如果你不能用1/2 + 1/4 + 1/8等获得它,它可能会被舍入)
答案 1 :(得分:0)
几乎所有数字都很麻烦。次要的例外是那些,当重复乘以2时除去小数部分并最终小于2 ^ 24。
e.g。
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 ... )
修改强>
鉴于问题的目的/背景,当浮点向零舍入时,不精确似乎会造成麻烦。
e.g。
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驱动程序的程序员交谈......