这里是question with answers on "Cross Platform Floating Point Consistency",但它只讨论运行时一致性(IEEE浮点数)。
我对编译时一致性感兴趣,尤其是:
如果我有一个特定的浮点数,想输入一个 我的源代码中的浮点文字,并具有每个编译器 以IEEE-754体系结构为目标将其编译为相同的位 实际上是浮动(或双精度)的模式:我该怎么办?
(我知道关于将浮点值从IEEE格式往返转换为十进制表示然后返回的问题,多年来一直存在争议,我不知道这是否是浮点问题文字和编译器(以及C ++标准)。
答案 0 :(得分:1)
您可以利用以下事实:尽管每个十进制浮点数在IEEE-754浮点表示法(使用二进制)中均没有确切的表示形式,但每个IEEE浮点数都有一个精确的表示形式。作为十进制浮点数。
在[lex.fcon]
(“浮动文字”)中的C ++语言规范讨论了浮点文字。在描述浮点文字的所有部分之后,它说
如果标度值在其类型的可表示值范围内,则结果为标度值(如果可表示),否则以实现定义的方式选择最接近标度值的较大或较小的可表示值。
(C ++ 11后期工作论文N3242和2018年以后的N4741的工作原理都是相同的。我在CPPReference上找不到此描述。)
这意味着诸如0.1
之类的数字可以比期望值略小或略大于所需值,其他诸如0.5
或0.000000000931322574615478515625
之类的数字(2 -30 )将在所有符合条件的编译器中具有该值。
您需要获取十进制数字,在该数字之前或之后获取该数字的IEEE-754表示形式,然后将该表示形式转换为等效的十进制数字。一旦有了这些,所有支持IEEE-754浮点格式的符合标准的编译器都应该为您提供完全相同的常数。