浮点字面至IEEE-754二进制图案跨编译器的二元模式一致性

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

本文关键字:一致性 模式 二元 编译器 IEEE-754 二进制      更新时间:2023-10-16

这是一个问题,上面有"跨平台浮点一致性"上的答案,但它仅与 Rundime 一致性(IEEE浮点)进行讨论。

我对 compile time 一致性感兴趣,特别是:

如果我有一个特定的浮点数,并且想放一个 我的源代码中的浮点字面文字,并拥有每个编译器 针对IEEE-754体系结构将其编译到同一位 实际上是漂浮(或double)的模式:我需要做什么?

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

(我知道多年来一直争议您需要做什么才能从IEEE格式到小数表示往返浮点值,并且我不知道这是否是浮点的问题文字和编译器(以及C 标准)。)

您可以利用以下事实:虽然每个小数小数点浮点数都不具有IEEE-754浮点表示(使用二进制)中的IEEE-754浮点数IEEE浮点数具有精确的表示形式为十进制浮点数。

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

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

(在N3242,C 11较晚工作文件和2018年的N4741中,此工作都是相同的。我在CPPReference上找不到此描述。

这意味着像0.1这样的数字可能比所需值稍小或稍微稍大一些,而其他数字(例如0.50.000000000931322574615478515625(2 -30 ))将具有所有符合编译器的值。p>您需要获取小数号,在其之前或之后获得该号码的IEEE-754表示,然后将该表示形式转换为等效的小数号。一旦拥有,所有支持IEEE-754浮点格式的编译器都应给您完全相同的常数。