是" reals"在Fortran和#34;浮动"在C ++中?

时间:2013-11-17 01:00:42

标签: c++ floating-point fortran

我已经将一些代码从Fortran转换为C ++,除了我数据集中间的两个数据点之外,两个代码都给出了给定输入的相同结果。

我的代码计算点之间的距离,并使用该信息做一些有趣的事情。发现C ++代码中的两个点彼此相距一定距离,并且在Fortran中距离不同。代码很长,所以我不会发布它。

这让我觉得奇怪,因为我的代码中间有两个“奇怪点”,而其他所有106个点都表现相同。

我已经阅读了 Goldberg论文,这让我相信在我的32位系统上,real和float应该是相同的。

2 个答案:

答案 0 :(得分:1)

Fortran中的real在C ++中可能是float(类型4)或double(种类8)。

它还可能取决于您的编译器选项(即数学扩展,优化,平方根实现等)。

答案 1 :(得分:0)

在您遇到的大多数C / C ++实现中,float对应REAL*4double对应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.0x提升为double,算术运算,然后转换为浮点数。

要获得单精度常量并保持算术的单精度,您需要添加后缀f,如下所示:

float x;
x = 1.0f + 2.0f;
x = x + 3.0f;

现在这个算法都将以单精度完成。

对于数学库调用,单精度变体通常还有f后缀,例如cosfsqrtf