gpt4 book ai didi

c++ - 这个 "denormal data"是关于什么的? - C++

转载 作者:行者123 更新时间:2023-12-02 07:48:48 25 4
gpt4 key购买 nike

我想对“非规范数据”及其含义有一个广泛的看法,因为我认为我唯一正确的事实是,从程序员的角度来看,它与浮点值特别相关,并且与一般性相关-从 CPU 的角度计算方法。

有人可以帮我解密这两个字吗?

编辑

请记住,我面向 C++ 应用程序,并且只面向 C++ 语言。

最佳答案

您询问 C++,但浮点值和编码的细节由浮点规范决定,特别是 IEEE 754,而不是由 C++。 IEEE 754 是迄今为止使用最广泛的浮点规范,我将回答使用它。
在 IEEE 754 中,二进制浮点值由三部分编码:符号位 s(0 表示正,1 表示负)、有偏指数 e(表示的指数加上固定偏移量)和有效数字字段 f(分数部分)。对于正常数,它们准确地表示数 (-1)s • 2e-bias • 1.f,其中 1.f 是通过在“1.”之后写入有效位而形成的二进制数字。 (例如,如果有效位字段有十位 0010111011,则表示有效位 1.00101110112,即 1.182617175 或 1211/1024。)
偏差取决于浮点格式。对于 64 位 IEEE 754 二进制,指数字段有 11 位,偏差为 1023。当实际指数为 0 时,编码指数字段为 1023。-2、-1、0、1 和 2 的实际指数编码指数为 1021、1022、1023、1024 和 1025。当有人说次正规数的指数为零时,他们的意思是编码指数为零。实际指数将小于 -1022。对于 64 位,正常指数间隔为 -1022 到 1023(编码值 1 到 2046)。当指数超出此区间时,会发生特殊情况。
在此区间之上,浮点数停止表示有限数。 2047 的编码指数(全 1 位)表示无穷大(有效位字段设置为零)。低于此范围,浮点数变为次正规数。当编码指数为零时,有效位字段表示 0.f 而不是 1.f。
这有一个重要的原因。如果最低指数值只是另一种正常编码,那么其有效数的低位将太小而无法单独表示为浮点值。没有那个前导的“1.”,就没有办法说出第一个 1 位在哪里。例如,假设您有两个数字,均具有最低指数,并且有效数分别为 1.00101110112 和 1.00000000002。减去有效数后,结果为 0.00101110112。不幸的是,无法将其表示为正常数字。因为您已经处于最低指数,所以您无法表示该结果中第一个 1 所在位置所需的较低指数。由于数学结果太小而无法表示,计算机将被迫返回最接近的可表示数,即零。
这会在浮点系统中创建不需要的属性,您可以拥有 a != b但是 a-b == 0 .为了避免这种情况,使用了次正规数。通过使用次正规数,我们有一个特殊的区间,其中实际指数不会减少,我们可以在不创建太小而无法表示的数字的情况下执行算术。当编码指数为零时,实际指数与编码指数为 1 时相同,但有效数的值变为 0.f 而不是 1.f。当我们这样做时,a != b保证 a-b 的计算值不为零。
以下是 64 位 IEEE 754 二进制浮点编码中的值组合:


标志
指数 (e)
有效数位 (f)
意义


0
0
0
+零

0
0
非零
+2−1022•0.f(次正常)

0
1 到 2046
任何事物
+2e−1023•1.f(正常)

0
2047
0
+无穷大

0
2047
非零但高位关闭
+, 信号 NaN

0
2047
高位开启
+, 安静的 NaN

1
0
0
-零

1
0
非零
−2−1022•0.f(次正常)

1
1 到 2046
任何事物
−2e−1023•1.f(正常)

1
2047
0
-无穷大

1
2047
非零但高位关闭
-, 信号 NaN

1
2047
高位开启
-,安静的 NaN


一些注意事项:
+0 和 -0 在数学上相等,但保留符号。精心编写的应用程序可以在某些特殊情况下使用它。
NaN 的意思是“不是数字”。通常,这意味着发生了一些非数学结果或其他错误,应该放弃计算或以其他方式重新进行计算。通常,带有 NaN 的操作会产生另一个 NaN,从而保留出现问题的信息。例如,3 + NaN产生一个 NaN。信号 NaN 旨在引起异常,以指示程序出错或允许其他软件(例如调试器)执行某些特殊操作。在 NaN 只是大量数据的一部分并且稍后将单独处理或将被丢弃的情况下,安静的 NaN 旨在传播到进一步的结果,允许完成大型计算的其余部分。
+ 和 - 符号与 NaN 一起保留,但没有数学值(value)。
在正常编程中,您不应该关心浮点编码,除非它告知您浮点计算的限制和行为。您不需要对次正规数做任何特殊处理。
不幸的是,一些处理器被破坏,因为它们要么通过将次正规数更改为零而违反 IEEE 754 标准,要么在使用次正规数时执行速度非常慢。在为此类处理器编程时,您可能会尽量避免使用次正规数。

关于c++ - 这个 "denormal data"是关于什么的? - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14001910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com