我正在阅读逐渐下溢的概念以及它在音乐行业中的重要性Gradual overflow Application in Music
我很清楚溢出缓冲区的问题,但我不知道如何表示下溢。
你能给我一个例子(最好用c或c ++编写的程序),就像计算机如何处理逐渐下溢一样吗?
答案 0 :(得分:0)
逐渐下溢与IEEE 754称之为“次正常”数字有关。
考虑使用科学记数法,其中你有(比方说)10位精度和指数,范围从-99到99.
在正常情况下,您将所有内容视为科学记数法,因此如果您想表示1000,则将其表示为1e3 - 即1 * 10 3 。
现在,考虑像1.234e-102这样的数字。您可以表示的最小指数是-99。所以,如果你以最简单的方式完成你的工作,那么你就是因为它的指数小于那个,它就是0.这就是“快速下溢”。
在IEEE 754(和相关标准)中,您可以将其存储为(基本上)0.001234 * 10 -99 。这样做,与指数在-99 ... 99范围内的正常数字相比,您可能会失去一些精确度。另一方面,如果您将其舍入为零,则会丢失 less ,因为它的指数小于-99。实际上,在这种情况下,它以4位有效数字开头,如图所示,它保留所有4位有效数字。
在计算机上,数字以二进制表示,因此当转换为十进制时,有效数字和/或指数的最大范围数不是圆数,但同样的基本思想适用 - 当我们有一个数字时它太小而无法以正常格式表示,我们仍然可以用可以表示的最小指数存储它,但也包括一些前导零。
这确实导致了一个难题:数字通常以所谓的标准化形式存储。 “有效数”部分通过向左移动直到第一个数字为1来归一化(请记住,因为它是二进制的,它只能是0或1)。因为我们知道它是1,所以我们作弊:我们通常不会将数字1存储在存储的数字中。因此,双精度浮点数通常具有53位精度,但实际上只有存储 52位有效数。
使用次正规数,不再是这种情况。这不是非常难以处理的,但它仍然引入了一个特殊情况 - 而且很少使用,因此CPU设计人员(等等)很少尝试对其进行优化。因此,在执行包含次正规的数据时,完全相同的代码可能会突然运行 lot 。