代表逐步下流程序

我正在阅读关于渐进式下溢概念及其在音乐行业中的重要性如何逐渐溢出应用于音乐

我很清楚溢出缓冲区的问题,但我不知道如何表示下溢。

你能给我一个例子(一个最好用c或c ++的程序),就像计算机如何处理逐渐下溢一样?

逐渐下溢与IEEE 754称之为“次正常”数字有关。

考虑使用科学记数法,其中你有(比方说)10位数的精度和指数,范围从-99到99。

在正常情况下,您将所有内容视为科学记数法,因此如果要表示1000,则将其表示为1e3 – 即1 * 10 3

现在,考虑像1.234e-102这样的数字。 您可以表示的最小指数是-99。 所以,如果你以最简单的方式完成你的工作,你只需要因为它的指数小于那个,它就是0.这就是“快速下溢”。

在IEEE 754(和相关标准)中,您可以将其存储为(基本上)0.001234 * 10 -99 。 这样做,与指数在-99 … 99范围内的正常数字相比,您可能会失去一些精确度。 另一方面,由于它的指数小于-99,因此只会将其四舍五入为零。 实际上,在这种情况下,它以4位有效数字开头,如图所示,它保留所有4位有效数字。

在计算机上,数字以二进制表示,因此当转换为十进制时,有效数字和/或指数的最大范围数不是圆数,但同样的基本思想适用 – 当我们有一个太小的数字时为了表示正常格式,我们仍然可以用可以表示的最小指数存储它,但也包括一些前导零。

这确实导致一个困难:数字通常以所谓的标准化forms存储。 “有效数”部分通过向左移动直到第一个数字为1来归一化(请记住,因为它是二进制的,它只能是0或1)。 由于我们知道它是1,我们作弊:我们通常不会将数字1存储在存储的数字中。 因此,双精度浮点数通常具有53位精度,但实际上只存储 52位有效数。

使用次正规数,不再是这种情况。 这并不是非常难以处理,但它仍然引入了一个特殊情况 – 而且很少使用,因此CPU设计人员(等等)很少尝试对其进行优化。 因此,在执行包含次正规的数据时,完全相同的代码会突然运行得慢得多。