什么是32位浮点可以准确表示为一位小数的最高值?

时间:2018-06-18 00:50:42

标签: floating-point precision running-total

问题:IEEE-754 32位浮点数据能够准确表示一位小数的最高值是什么?

背景:我发现了这个问题:Which is the first integer that an IEEE 754 float is incapable of representing exactly?

......这一切都有道理,但我不确定如何将那里给出的方法翻译成我的问题。

我的应用是:我正在编写一个累加器函数,它将权重加到一个小数位,将它们存储在32位浮点数中。在某些时候,如果没有重置,这个累加器将开始失去准确性。我想确定这一点是什么,以便我可以提醒用户累加器不再准确,或者自动重置它。

2 个答案:

答案 0 :(得分:2)

根据您要编写的功能的说明,您打算提出的问题似乎是:

  

最大的 x 是什么:对于任何列表L的数字,其总和不超过 x ,并且每个数字都可以写为正十进制数字在小数点后一位数字时,数字的32位二进制浮点和,当转换为带小数点的十进制数时,等于数字的总和?

我们可以计算 x 。但是,这是您要编写的函数的错误方法。更好的方法是取每个权重,乘以10得到一个整数,然后累加这些整数的总和。这个总和可以用整数运算累加,尽管浮点数足以达到整数不能再精确表示的程度。

我的直觉是,这将允许累积到比第一种方法更高的限制,因为它不会产生舍入误差,因此可以继续使用浮点格式的完整有效数字(如果浮点用于累积) ,而第一种方法会导致舍入错误,因此可能会更快失败。

答案 1 :(得分:1)

我按如下方式进行了测试:

Set Test_INT to 0
Set Test_FLOAT to 0
Set Counter to 0
Set STOP to False

While Not STOP(
1. Increment Counter by 1
2. Divide Counter by 10, store result in Test_FLOAT
3. Multiply Counter by 10, store result in Test_INT
4. If Test_Int <> Counter, STOP = True
)

这个想法是每次计数器递增时,我将它除以10,将其存储在浮点数中,然后将其乘以10.如果浮点数能够正确地将值显示为1 DP,则乘法将得到与除法之前相同的值,循环将继续。如果浮点数必须向上或向下舍入,则乘以10时的值将不同,从而停止循环。

结果是循环停止时整数值为10485763.确认这一点后,我将1048576.2输入浮点寄存器,并立即更新为显示1048576.3。

根据这项测试,我的答案是1048576.1。

相关问题