我读到了关于渐变下溢的概念,以及它在音乐行业中的重要性渐变下溢在音乐中的应用
我很理解缓冲区溢出的问题,但我不知道如何表示下溢。
你能给我举一个例子吗(最好是用c或c++编写的程序),比如计算机如何处理逐渐下溢?
逐渐下溢与IEEE 754所称的"亚正常"数有关。
考虑使用科学记数法,其中有(比如)10位数的精度和范围从-99到99的指数。
在正常情况下,你把所有的东西都当作科学符号,所以如果你想表示1000,你就把它表示为1e3——也就是说,1*103。
现在,考虑一个像1.234e-102这样的数字。你能表示的最小指数是-99。所以,如果你用最简单的方法来完成你的工作,你只需要简单地说,因为它的指数比它小,所以它只是0。那将是"快速下溢"。
在IEEE 754(及相关标准)中,您可以将其存储为(本质上)0.00134*10-99。在这样做的过程中,与指数在-99…99范围内的常数值相比,您可能会损失一些精度。另一方面,与将其四舍五入为零相比,您损失的更少,因为它的指数小于-99。事实上,在这种情况下,它从4个有效数字开始,并且如图所示,它保留了所有4个有效位数。
在计算机上,数字是用二进制表示的,因此有效位数和/或指数的最大范围在转换为十进制时不是整数,但同样的基本思想也适用——当我们有一个太小而无法用正常格式表示的数字时,我们仍然可以用可以表示的最小指数来存储它,而且还包括一些前导零。
这确实导致了一个困难:数字通常以所谓的归一化形式存储。"有效位"部分通过左移直到第一个数字是1来进行归一化(请记住,由于它是二进制的,所以只能是0或1)。既然我们知道这是一个1,我们就有点作弊:我们通常不会在存储数字时将1存储在数字中。因此,双精度浮点数通常有53位精度,但实际上只有存储52位有效位。
有了一个低于正常值的数字,情况就不再是这样了。这并不是很难处理,但它仍然引入了一种特殊情况——而且这种情况很少被使用,所以CPU设计者(等等)很少尝试为此进行优化。因此,在对包含子规范的数据执行时,完全相同的代码可能会突然运行得慢很多。