繁体   English   中英

非规范化数字 - IEEE 754 浮点数

[英]Denormalized Numbers - IEEE 754 Floating Point

因此,我正在尝试更多地了解 IEEE 754 浮点数标准中定义的非规范化数。 由于 Google 搜索结果,我已经阅读了几篇文章,并且浏览了几篇 StackOverFlow 帖子。 但是,我仍然有一些问题没有得到解答。

首先,回顾一下我对非规范化浮点数的理解:

具有较少精度位且比规范化数字更小的数字(在数量上)

本质上,非规范化浮点数能够表示可以用任何浮点值表示的最小(数量级)数。

这听起来正确吗? 还有什么比这更重要的吗?

我读过:

在许多平台上使用非规范化数字会带来性能成本

对此有何评论?

我还阅读了其中一篇文章

人们应该“避免规范化和非规范化数字之间的重叠”

对此有何评论?

在 IEEE 标准的一些演示文稿中,当呈现浮点范围时,非规范化值被排除在外,表格被标记为“有效范围”,几乎就像演示者在想“我们知道非规范化数字可以表示最小可能的浮点数”点值,但由于非规范化数字的某些缺点,我们选择将它们排除在更适合常见使用场景的范围之外”——好像非规范化数字不常用。

我想我一直觉得使用非规范化数字在大多数情况下不是一件好事?

如果我必须自己回答这个问题,我会想:

使用非规范化数字很好,因为您可以表示可能的最小(数量级)数字——只要精度不重要,并且不将它们与规范化数字混淆,并且应用程序的最终性能符合要求。

使用非规范化数字是一件坏事,因为大多数应用程序不需要这么小的表示——精度损失是有害的,你可以通过将它们与规范化数字混合来太容易地射中自己的脚,而且性能不值得付出代价大多数情况下。

对这两个答案有什么评论吗? 关于非规范化数字,我还有什么可能遗漏或不理解?

本质上,非规范化浮点数能够表示可以用任何浮点值表示的最小(数量级)数。

那是正确的。

在许多平台上使用非规范化数字会带来性能成本

不同处理器的惩罚是不同的,但最多可以达到 2 个数量级。 原因? 与此建议相同:

人们应该“避免规范化和非规范化数字之间的重叠”

关键在于:非规范化是 IEEE-754 浮点格式中的定点“微格式” 在正常数中,指数表示二进制小数点的位置。 非正规数包含定点表示法中的最后 52 位,双精度数的指数为 2 -1074

因此,非规范化很慢,因为它们需要特殊处理。 在实践中,它们很少发生,芯片制造商不喜欢在罕见的情况下花费太多宝贵的资源。

将非正规数与法线混合是很慢的,因为那时您正在混合格式,并且您需要在两者之间进行转换的额外步骤。

我想我一直觉得使用非规范化数字在大多数情况下不是一件好事?

创建非正规变量是为了一个主要目的:逐渐下溢 这是一种保持微小数字之间的相对差异很小的方法。 如果你直接从最小的正常数到零(突然下溢),相对变化是无限的。 如果在下溢时使用非规范化,相对变化仍然不完全准确,但至少更合理。 这种差异体现在计算中。

换一种说法。 浮点数分布不均匀。 2 的连续幂之间总是有相同数量的数字:2 52 (双精度)。 因此,如果没有非正规数,您总是会在 0 和最小浮点数之间存在差距,该差距是最小两个数字之间差异大小的 2 52倍。 Denormals 统一填补了这个空白。

作为一个关于突然下溢和逐渐下溢的影响的例子,看看数学上等价的x == yx - y == 0 如果xy很小但不同并且您使用突然下溢,那么如果它们的差小于最小截止值,则它们的差将为零,因此违反了等价性。

随着逐渐下溢,两个微小但不同的正态数之间的差异成为非正态数,仍然不为零。 等价性被保留。

因此,不建议故意使用非规范化,因为它们仅被设计为特殊情况下的备份机制

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM