是",;reals“;在Fortran语言中,与“相同”;“浮动”;在C++;? 我已经把一些代码从Fortran翻译成C++,并且两个代码都给了我相同的结果,对于给定的输入,除了数据集中的两个数据点之外。p>
我的代码计算点之间的距离,并利用这些信息做一些有趣的事情。发现C++代码中的两个点彼此之间在一个距离上,在FORTRAN中的距离不同。代码很长,所以我不会发布它是",;reals“;在Fortran语言中,与“相同”;“浮动”;在C++;? 我已经把一些代码从Fortran翻译成C++,并且两个代码都给了我相同的结果,对于给定的输入,除了数据集中的两个数据点之外。p>,c++,floating-point,fortran,C++,Floating Point,Fortran,我的代码计算点之间的距离,并利用这些信息做一些有趣的事情。发现C++代码中的两个点彼此之间在一个距离上,在FORTRAN中的距离不同。代码很长,所以我不会发布它 这让我觉得很奇怪,因为这两个“奇怪点”正好在我的代码中间,而其他106个点都是相同的。 我已经读过Goldberg的论文,它让我相信在我的32位系统上实型和浮点型应该是相同的。在大多数C/C++实现中,float对应于real*4,而double对应于real*8 此StackOverflow答案(和相关注释)描述Fortran 90
这让我觉得很奇怪,因为这两个“奇怪点”正好在我的代码中间,而其他106个点都是相同的。
我已经读过Goldberg的论文,它让我相信在我的32位系统上实型和浮点型应该是相同的。在大多数C/C++实现中,
float
对应于real*4
,而double
对应于real*8
此StackOverflow答案(和相关注释)描述Fortran 90的类型:
由于计算顺序不同,浮点计算可能会出现差异。浮点算法对求值顺序非常敏感,特别是在涉及宽动态范围的值之间的加减运算时 此外,C/C++数学和数学库在许多令人惊讶的地方默认为
双精度
,除非您明确要求浮点
。例如,常数1.0
是双精度常数。考虑下面的代码片段:
float x;
x = 1.0 + 2.0;
x = x + 3.0;
表达式1.0+2.0
以双精度计算,结果返回到单精度。同样,第二条语句x+3.0
将x
升级为double
,执行算术运算,然后返回到float
要获取单精度常数并使算术保持单精度,需要添加后缀f
,如下所示:
float x;
x = 1.0f + 2.0f;
x = x + 3.0f;
现在,这个算法将以单精度完成
对于数学库调用,单精度变量通常还具有
f
后缀,例如cosf
或sqrtf
在Fortran中,P> <代码> >实际< /C> >可以是C++中的代码>浮点< /C> >(或是4)或<代码>双< /代码>(类型8)。
它还可能取决于编译器选项(即数学扩展、优化、平方根实现等) 你的Fortran类型指南已经过时了。星号符号从来都不是标准符号,20年前已经被实物符号取代。