c++ - 渐进下溢程序的表示

标签 c++ c linear-algebra

我正在阅读有关渐进下溢概念及其在音乐行业中的重要性的文章Gradual overflow Application in Music

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

您能否给我一个示例(最好是 C 或 C++ 程序),例如计算机如何处理渐进下溢?

最佳答案

逐渐下溢与 IEEE 754 所谓的“次正规”数有关。

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

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

现在,考虑一个像 1.234e-102 这样的数字。您可以表示的最小指数是 -99。因此,如果您以最简单的方式完成工作,您只需知道,由于它的指数小于该值,因此它只是 0。这将是“快速下溢”。

在 IEEE 754(及相关标准)中,您可以将其存储为(本质上)0.001234 * 10-99。这样做时,与指数在 -99...99 范围内的正常数字相比,您可能会损失一些精度。另一方面,您的损失比直接将其四舍五入为零要少,因为它的指数小于 -99。事实上,在本例中,它以 4 个有效数字开头,并且如图所示,它保留了所有 4 个有效数字。

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

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

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

关于c++ - 渐进下溢程序的表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26642756/

相关文章:

r - 递归矩阵的快速叉积

performance - 对球体应用矩阵变换

c++ - 如果使用 typedef 则无法推断模板参数

c - libav - avcodec_video_encode2() + fwrite() = 非功能文件

c++ - 优化项目冲销

c - 如何将c代码映射到postgres c函数格式?

c - 快速排序代码出错但未在错误窗口中显示

scala - 如何从 Scala 求解大型稀疏线性系统

c++ - cppdepend。问题?发行说明?社区?支持?

c++ - ":"Struct 构造函数中的冒号