Har*_*mar 3 c floating-point ieee-754
我对这些事情很好奇:
如果您能引用任何来源,那将非常有帮助。我查看了 IEEE-754 文档,但无法找到有关实现的任何具体声明。
编辑:假设 IEEE-754 规范
C语言总是以标准化形式存储浮点数吗?
“这取决于。” 正如我们将看到的,决定这一点的是硬件而不是 C 语言。
如果实现使用IEEE-754以外的其他东西,我们就无话可说了。
如果实现确实使用 IEEE-754,则所有数字都始终以标准化形式存储,除了那些未标准化的数字(即 subnormals )。
这对于某些算术(加法、乘法)后获得的结果也适用吗?
是的。(下面有更多相关内容。)
它取决于语言还是硬件 - FPU?
它通常取决于硬件。大多数时候,假设目标处理器完全支持浮点,C 程序会直接编译为本机浮点指令,而不需要任何语言或编译器强加的额外处理。(这与 Java 等语言形成鲜明对比,Java 确实具有语言强加的浮点定义,部分由 JVM 实现。)
C 标准确实有一个可选部分“Annex F”,它指定了一系列符合 IEEE-754 的特定浮点行为。
现在,如果C 实现采用附件 F 并符合 IEEE-754(通常是因为底层硬件也是如此),那么前两个问题的答案就会变得更加容易。在 IEEE-754 二进制算术中,除了一个例外,不存在表示的歧义。每个可以用归一化形式表示的数字都只有一个归一化表示。每个不能用标准化形式表示但可以表示为次正规的数字都只有一个次正规表示。这些约束适用于每个 IEEE-754 浮点数,包括(自然)其他运算的结果。
(正如 Eric 和 Chux 在评论中提醒我的那样,例外是零,IEEE-754 有两个例外,正的和负的。)
那么“结果是否总是标准化的?”的答案 是“否”(因为 IEEE-754 肯定有这些次正规数,当然为零),但如果问题是“每个数字都有唯一的表示形式吗?”,答案大多是“是”。(同样,零除外。或者,如果您是极少数使用 IEEE-754-2008十进制格式做某事的人之一,这种十进制格式就不那么独特了。)另请参阅如何区分 1 和零浮点 -点值?
我想最后一个问题是“有多少 C 实现采用附件 F?”,或者换句话说,“有多少处理器符合 IEEE-754?” 对于通用计算机(大型机和个人计算机)上的CPU,据我所知,目前的答案是“全部”。另一方面,GPU 故意不完全兼容 IEEE-754(因为这样它们的效率会更高)。微处理器,对于“嵌入式”工作,我不太确定。(通常他们根本没有可行的浮点。)