我已经将一些代码从Fortran转换为C ++,除了我数据集中间的两个数据点之外,两个代码都给出了给定输入的相同结果。
我的代码计算点之间的距离,并使用该信息做一些有趣的事情。发现C ++代码中的两个点彼此相距一定距离,并且在Fortran中距离不同。代码很长,所以我不会发布它。
这让我觉得奇怪,因为我的代码中间有两个“奇怪点”,而其他所有106个点都表现相同。
我已经阅读了 Goldberg论文,这让我相信在我的32位系统上,real和float应该是相同的。
答案 0 :(得分:1)
Fortran中的real
在C ++中可能是float
(类型4)或double
(种类8)。
它还可能取决于您的编译器选项(即数学扩展,优化,平方根实现等)。
答案 1 :(得分:0)
在您遇到的大多数C / C ++实现中,float
对应REAL*4
,double
对应REAL*8
。
此StackOverflow答案(及相关评论)描述了Fortran 90的类型:Fortran 90 kind parameter。
由于评估顺序不同,可能会出现浮点计算的差异。浮点运算对评估顺序非常敏感,尤其是涉及具有宽动态范围的值之间的加法和减法时。
此外,C / C ++数学和数学库在许多令人惊讶的地方默认为double
精度,除非您明确要求float
。例如,常量1.0
是双精度常量。请考虑以下代码片段:
float x;
x = 1.0 + 2.0;
x = x + 3.0;
表达式1.0 + 2.0
以双精度计算,结果转换为单精度。同样,第二个语句x + 3.0
将x
提升为double
,算术运算,然后转换为浮点数。
要获得单精度常量并保持算术的单精度,您需要添加后缀f
,如下所示:
float x;
x = 1.0f + 2.0f;
x = x + 3.0f;
现在这个算法都将以单精度完成。
对于数学库调用,单精度变体通常还有f
后缀,例如cosf
或sqrtf
。