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

时间:2019-03-06 18:10:44

标签: c++ c++11 floating-point-conversion

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

我对编译时一致性感兴趣,尤其是:

  

如果我有一个特定的浮点数,想输入一个   我的源代码中的浮点文字,并具有每个编译器   以IEEE-754体系结构为目标将其编译为相同的位   实际上是浮动(或双精度)的模式:我该怎么办?

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

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

1 个答案:

答案 0 :(得分:1)

您可以利用以下事实:尽管每个十进制浮点数在IEEE-754浮点表示法(使用二进制)中均没有确切的表示形式,但每个IEEE浮点数都有一个精确的表示形式。作为十进制浮点数

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

  

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

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

这意味着诸如0.1之类的数字可以比期望值略小或略大于所需值,其他诸如0.50.000000000931322574615478515625之类的数字(2 -30 )将在所有符合条件的编译器中具有该值。

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