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

Floating-point literal to IEEE-754 binary pattern consistency across compilers

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

我对编译时一致性感兴趣,特别是:

If I have a specific floating-point number and want to put a floating-point literal in my source code and have every compiler targeting an IEEE-754 architecture compile that to the same bit pattern that is in fact that float (or double): what do I need to do?

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

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

C++ 语言规范在 [lex.fcon] ("floating literals") 中讨论了浮点文字。在描述了浮点文字的所有部分之后,它说

If the scaled value is in the range of representable values for its type, the result is the scaled value if representable, else the larger or smaller representable value nearest the scaled value, chosen in an implementation-defined manner.

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

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

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