Math 浮点加法的问题。忽略一些小值

Math 浮点加法的问题。忽略一些小值,math,cuda,floating-point,Math,Cuda,Floating Point,我在找一本关于CUDA的书 在解释CUDA浮点运算的章节中,我发现了一些奇怪的东西 书上说(1.00*1)+(1.00*1)+(1.00*0.01)+(1.00*0.01)=10。所有的数字都是二进制文件。0.01表示十进制0.25 所以,在十进制中,连续加1+1+0.25+0.25得到2 书中说了为什么会发生这种情况;执行1+1后,它将忽略+0.25,因为它与其他操作数(1+1的结果,2)相比太小。 在这之后,他们说做0.25+0.25+1+1将产生2.5,因为0.5被认为足以与1相加 这是什

我在找一本关于CUDA的书

在解释CUDA浮点运算的章节中,我发现了一些奇怪的东西

书上说(1.00*1)+(1.00*1)+(1.00*0.01)+(1.00*0.01)=10。所有的数字都是二进制文件。0.01表示十进制0.25

所以,在十进制中,连续加1+1+0.25+0.25得到2

书中说了为什么会发生这种情况;执行1+1后,它将忽略+0.25,因为它与其他操作数(1+1的结果,2)相比太小。

在这之后,他们说做0.25+0.25+1+1将产生2.5,因为0.5被认为足以与1相加


这是什么意思?处理器如何判断0.25比2小?是否有明确的标准?

所有这些工作(或不工作)的机制是,如果将数字相加,则较小数字的某些精度(绝对值)将丢失。这来自于执行操作的有限精度

两个数字之和之间的差距越小,损失就越小

在你的例子中,当你做1+1,你得到2。那么0.25比2小10倍。你的书指出,这是一个非常大的因子,0.25非常小,就像加上0一样(这是0.25的近似值,其数量级由2设定)。第二个0.25也会发生同样的情况:它不会增加任何内容


当你从0.25+0.25开始时,你将两个相同大小的数字相加,得到一个完美的0.5。当你加1的时候,你加了两个数字,比率只有2:这比前一个例子中的10要小得多,你的书上说这是可以做到的,所以你得到的总数是1.5。还有剩下的第1项:你要加上1.5和1;两者之间的系数仅为1.5,因此,同样可以这样做,得到2.5。

该示例隐式声明了一种二进制浮点格式,具有任意精度指数,但尾数中只有2位。所有数字的格式为1.xx*2^n

执行浮点加法时,必须对参数进行反规范化或缩放,使其具有相同的指数

   0.25 =   1e-2 = 0.5e-1 = 0.25e0 = 0.125e1
   2.00 =   1e1
但在相同的基数下,0.125=0.001,这不能用小数点后的2位尾数表示

即使我们增加字长,也没关系:

  0.25 = 0.001000000000000000 (e=1)
  2.00 = 1.000000000000000000 (e=1)
  ---------------------------------
  2.25 = 1.001000000000000000 (e=1)
           ^^

结果将是小数点后的两位,即(1.00e1)=2。

似乎发生了从浮点到整数的隐含强制;然后根据通常的规则进行四舍五入。也许你可以发布一个链接到你看到的确切的引用,这样它可以被更完整地解析。1)这不是CUDA特有的;这就是IEEE-754浮点数学的工作原理。2) 本书的这一部分似乎在解释有限精度是如何工作的。为了清楚起见,在这个人工示例中使用了尾数中不现实的低位数。现实世界中的浮点格式,如IEEE-754浮点,当然会正确地将1+1+0.25+0.25计算为2.5。这本书是对大规模并行处理器进行编程的。