我知道IEEE 754浮标会随着时间的推移而失去精确度,但它并不是完全渐进的。由于指数数学,它基本上会在小数达到最大值时移动。但是,由于这不是基数10,我知道它不会从10.000到100.00。尽管如此,根据我的理解,它在基数2中做了类似的事情。我猜测在0和1之间存在很多这些变化,但是它们之间的间隔非常大。 这些精度变化发生在哪里?这对于告诉用户我的程序何时可能开始失去精度非常有用。
答案 0 :(得分:2)
对于非非规范化,非零,有限浮点数(即大多数“正常”浮点数),IEEE 754中的尾数在[1.0,2.0]范围内。尾数是在没有前导1的情况下编写的。
因此,很简单,每次操作强制尾数超出此范围(需要调整指数,并且尾数要移位)时,精度位将丢失。
精度损失的方式在很大程度上取决于您执行的操作。例如,如果你在很宽的数值范围内进行天真的求和(而不是卡汉求和),你将失去比你需要的更快的精度。
答案 1 :(得分:2)
这些移位在2的幂处发生。由于binary32浮点数由区间[1,2]中的24位数乘以2的幂,它们最多可以存储二进制表示的前24位一个数字。区间[1,2]中的任何内容都具有精确到2 ^ -23的增量。区间[2,4]中的任何内容都具有2 ^ -22的增量精度。区间[0.5,1]中的任何内容都具有2 ^ -24的增量精度。
一般来说,如果我们有
2^n <= x < 2^(n+1)
和x在正常范围内,然后x由2^(n-23)
的最接近倍数表示。