跨编译器的 IEEE-754 二进制模式一致性浮点文字

Posted

技术标签:

【中文标题】跨编译器的 IEEE-754 二进制模式一致性浮点文字【英文标题】:Floating-point literal to IEEE-754 binary pattern consistency across compilers 【发布时间】:2019-03-06 18:10:44 【问题描述】:

这是一个question with answers on "Cross Platform Floating Point Consistency",但它专门讨论运行时一致性(IEEE 浮点)。

我对编译时的一致性感兴趣,具体来说:

如果我有一个特定的浮点数并想放一个 我的源代码中的浮点文字并具有每个编译器 针对 IEEE-754 架构将其编译为相同的位 实际上是浮动(或双重)的模式:我需要做什么?

一定的位数? 该位模式的确切十进制数(而不是映射到该二进制模式的任何十进制数)? 或者?

(我知道多年来,关于将浮点值从 IEEE 格式往返转换为十进制表示并返回的问题一直存在争议,我不知道这是否是浮点问题文字和编译器(以及 C++ 标准)。)

【问题讨论】:

如果可以使用 C++17,则可以使用十六进制浮点文字进行往返。我一直在为(比如说)数字滤波器系数、正交节点等执行此操作。避免了争议。 这是一个很好的答案——除了我目前碰巧仅限于 C++11。所以我也对“低级”C++ 感兴趣! 我想你会受苦的。如果您的问题有一个很好的答案,它没有使用十六进制浮点文字,那么为什么需要将它添加到 C++17 中? 注意:我不是这方面的专家,但请查看 Higham 数值算法的准确性和稳定性中的“制表者的困境”。我认为这表明你想要的东西是不可能的。 @user14717 - 好吧,也许有一些不方便和/或不明显的方法。我的意思是,既然我们已经有了十六进制和八进制文字,为什么还要添加二进制整数文字? 【参考方案1】:

您可以利用这一事实,虽然每个十进制浮点数在 IEEE-754 浮点表示(使用二进制)中没有精确表示,每个 IEEE 浮点数都有一个精确表示作为十进制浮点数

[lex.fcon](“浮动文字”)中的 C++ 语言规范讨论了浮点文字。在对浮点文字的所有部分进行描述之后,它说

如果缩放值在其类型的可表示值范围内,则结果是缩放值(如果可表示),否则以实现定义的方式选择最接近缩放值的更大或更小的可表示值。

(在 N3242(C++11 后期工作论文)和 2018 年的 N4741 中,此工作方式相同。我无法在 CPPReference 上找到此描述。)

这意味着像0.1 这样的数字可以比期望的值略小或略多,其他像0.50.000000000931322574615478515625 (2-30) 将具有该值所有符合标准的编译器。

您需要获取十进制数,获取该数字之前或之后的 IEEE-754 表示,然后将该表示转换为等效的十进制数。一旦你有了它,所有支持 IEEE-754 浮点格式的符合标准的编译器都应该给你完全相同的常量。

【讨论】:

这是可行的——尤其是。 (对于float)在online converter here 的帮助下。也许这是总体上最好的规则。让我们稍等片刻看看。

以上是关于跨编译器的 IEEE-754 二进制模式一致性浮点文字的主要内容,如果未能解决你的问题,请参考以下文章

将十进制数表示成ieee754标准的32浮点规格化数 27/64

用python从二进制文件中读取32位带符号的ieee 754浮点?

IEEE-754浮点计算精度问题

IEEE-754浮点标准简介

IEEE 754 中的指数

IEEE 754 二进制浮点数不精确