当前位置: 首页 > 知识库问答 >
问题:

浮点运算

萧元徽
2023-03-14

我阅读关于浮点和舍入在浮点算术期间发生的错误。

我读了很多关于IEEE754单精度/双精度格式的文章。我知道有符号位、8(或)11位指数和23(或)52位有效位以及隐式前导位。

我也知道分母不是质因数2的实数不能完全表示,例如二进制中的0.1是0.0001100110011......

我知道0.1 0.1 0.1不等于0.3,因为舍入误差的累积。

同样,0.5也可以用二进制格式表示,因为它是1/2。但我不明白,鉴于上述舍入误差的累积,为什么0.10.1 0.1 0.1 0.1=0.5?

共有2个答案

杜楚
2023-03-14

双精度中的0.1是二进制中的0.00011001101。让我们逐步了解二进制加法,看看发生了什么:

  0.0001100110011001100110011001100110011001100110011001101
+
  0.0001100110011001100110011001100110011001100110011001101
-----------------------------------------------------------
  0.001100110011001100110011001100110011001100110011001101   (52 sig bits -- OK)
+
  0.0001100110011001100110011001100110011001100110011001101
-----------------------------------------------------------
  0.0100110011001100110011001100110011001100110011001100111  (54 sig bits -- must round to 53)
  0.0100110011001100110011001100110011001100110011001101     (rounded up)
+
  0.0001100110011001100110011001100110011001100110011001101
-----------------------------------------------------------
  0.0110011001100110011001100110011001100110011001100110101  (54 sig bits -- must round to 53)
  0.01100110011001100110011001100110011001100110011001101    (rounded down)
+
  0.0001100110011001100110011001100110011001100110011001101
-----------------------------------------------------------
  0.1000000000000000000000000000000000000000000000000000001 (55 sig bits -- must round to 53)
  0.1                                                       (rounded down)

因此,仅仅是由于圆形的累积,0.1乘以5就变成了0.5。

(这些值来自二进制转换器、二进制计算器和浮点转换器。)

董建茗
2023-03-14

在IEEE754四舍五入到最接近的偶数模式中,您有一些很好的特性
首先,对于任何有限浮点x和n

然后还有(2^n1)x==2^nx
(只要2^n1是可精确表示的,n

有了这些房产,你就有了

  • 0.1 0.1==2*0.1
  • 0.1 0.1 0.1 == 3*0.1
  • 0.1 0.1 0.1 0.1 == 4*0.1
  • 0.1 0.1 0.1 0.1 0.1 == 5*0.1

这还不够,因为在这个阶段,0.1并不完全是1/10,所以没有任何证据证明5*0.1 == 0.5。
例如3*0.1 != 0.3和5*0.3 != 0.15。

所以在这里,这只是运气,四舍五入的误差确实消失了,而不是累积
(n*0.1==n/10.0)对于从1到100的整数n,在100个整数中有65个为真(对于该区间中2的7次幂始终为真)。

 类似资料:
  • 对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?

  • 本文向大家介绍DSP中浮点转定点运算--浮点与定点概述,包括了DSP中浮点转定点运算--浮点与定点概述的使用技巧和注意事项,需要的朋友参考一下 一:浮点与定点概述  1.1相关定义说明   定点数:通俗的说,小数点固定的数。以人民币为例,我们日常经常说到的如123.45¥,789.34¥等等,默认的情况下,小数点后面有两位小数,即角,分。如果小数点在最高有效位的前面,则这样的数称为纯小数的定点数,

  • 以下是go中的示例代码: 结果线A1、B1和C1之间的差异是可以理解的。然而,从A2开始到C2魔法来了。来自B2和C2的结果都与来自A2线的结果不匹配。对于x2行(x=A、B或C)也是如此——但是x2和x4的输出是相同的。 为了确保,让我们以二进制形式打印结果。 上面代码中的一些事实(一个在bin表单中): 行A11和C11之间有差异(最后一位数字——就在指数之前)。 行A12和C12几乎相同(除

  • 本文向大家介绍DSP中浮点转定点运算--浮点数的存储格式,包括了DSP中浮点转定点运算--浮点数的存储格式的使用技巧和注意事项,需要的朋友参考一下 二:浮点数的存储格式 2.1 IEEE floating point standard   上面我们说了,浮点数的小数点是不固定的,如果每个人都按照自己的爱好存储在电脑里,那不就乱套了吗?那么怎么在计算机中存储这种类型的数字呢?象这类古老的问题前人早都

  • 本文向大家介绍DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略,包括了DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略的使用技巧和注意事项,需要的朋友参考一下 4.定点数模拟浮点数运算及常见的策略   相信大家到现在已经大致明白了浮点数转换成定点数运算的概貌。其实,原理讲起来很简单,真正应用到实际的项目中,可能会遇到各种各样的问题。具我的经验,常见的策略有如下几条: 1)除法转

  • 我编写了一个程序来演示Go中的浮点错误: 它打印: 这与用C编写的相同程序的行为相匹配(使用双代码类型) 但是,如果改用,程序就会陷入无限循环!如果将C程序修改为使用而不是,它将打印 为什么在使用时,Go程序的输出与C程序的输出不一样?