C:浮点运算的结果总是归一化的



我对这些东西很好奇:

  1. C语言是否总是以标准化形式存储浮点数?(也就是说,是否始终应用规范化?)
  2. 这也适用于算术(加法、乘法)后得到的结果吗
  3. 它是依赖于语言还是硬件-FPU

如果你能引用任何来源,那将非常有用。我看过IEEE-754文档,但找不到任何关于实现的具体说明。

编辑:假设IEEE-754规范

C语言是否总是以标准化形式存储浮点数?

"这取决于情况"正如我们将看到的,决定这一点的更多是硬件,而不是C语言。

如果实现使用IEEE-754以外的东西,我们就没什么好说的了。

如果实现确实使用了IEEE-754,那么所有的数字都会被标准化存储,除了那些没有标准化的数字,即子规范。

对于经过一些算术(加法、乘法)后获得的结果,这也适用吗?

是。(下面将详细介绍。)

它取决于语言还是硬件-FPU?

它通常取决于硬件。大多数情况下,假设目标处理器完全支持浮点,C程序会直接编译为本机浮点指令,而无需任何语言或编译器强加的额外处理。(例如,这与Java相反,Java确实有一个语言强加的浮点定义,该定义部分由JVM实现。)

C标准确实有一个可选部分;附录F";,它指定了一组符合IEEE-754的特定浮点行为。

现在,如果C实现采用附录F并符合IEEE-754(通常是因为底层硬件也是),那么前两个问题的答案会变得更容易。在IEEE-754二进制算术中,除了一个例外,不存在表示的歧义。每个可以用规范化形式表示的数字都有一个规范化表示。每一个不能用归一化形式表示,但可以用次正规表示的数字,都有一个次正规表示。这些约束适用于每个IEEE-754浮点数,当然也包括其他运算的结果。

(正如Eric和Chux在评论中提醒我的那样,例外情况是零,IEEE-754有两个,正和负。)

因此,";结果总是标准化的吗"是";否";(因为IEEE-754最肯定地具有这些子规范,当然是零),但是如果问题是";每个数字都有唯一的表示形式吗&";,答案大多是";是的"(同样,除了零。或者,如果你是少数使用IEEE-754-2008十进制格式的人之一,这种格式的唯一性要低得多。)另请参阅如何区分1和0浮点值?

我想最后一个问题是";有多少C实现采用了附录F&";,或者,换句话说,";有多少处理器符合IEEE-754"对于通用计算机(大型机和个人计算机)上的CPU,据我所知,现在的答案是";所有这些";。另一方面,GPU故意与IEEE-754不太兼容(因为这样它们的效率会更高)。微处理器;嵌入的";工作,我不太确定。(通常他们根本没有可行的浮点。)

如果您能引用任何来源,那将非常有用。

C 2018 5.2.4.2.23将数字x的浮点表示定义为x=sbe1≤=kpf>k[/sub>bk,其中s是符号(±1),b为基数,e是一个整数指数,范围从eminemaxp为精度(基数-b位数),fk为有效位的基数-

b然后第4段说:

除了标准化浮点数(f1>如果x≠0),浮点类型还可以包含其他类型的浮点数,如亚正规浮点数(x≠0,e=eminf1=0)和非正规浮点数

就是这样;除了附录F提供了对IEC 60559(实际上是IEEE 754)的可选绑定之外,C标准在其他方面对浮点数的规范化保持沉默。因此,这回答了问题:

C语言是否总是以标准化形式存储浮点数?(也就是说,是否总是应用归一化?)

否。

对于经过一些算术(加法、乘法)后获得的结果,这也适用吗?

否。

它取决于语言还是硬件-FPU?

这取决于每个C实现。C实现可能受到硬件的影响,或者可能采用浮点运算的软件实现。

最新更新