加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Fortran中的“reals”和C中的“浮动”是一样的吗?

发布时间:2020-12-16 07:06:36 所属栏目:百科 来源:网络整理
导读:我已经将一些代码从Fortran转换为C,并且除了我数据集中间的两个数据点之外,两个代码都给出了给定输入的相同结果. 我的代码计算了点之间的距离,并用这些信息做了一些有趣的事情.发现C代码中的两个点彼此相距一定距离,并且在Fortran中距离不同.代码很长,所以我
我已经将一些代码从Fortran转换为C,并且除了我数据集中间的两个数据点之外,两个代码都给出了给定输入的相同结果.

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

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

我已经阅读过Goldberg论文了,它让我相信我的32位系统上的真实和浮动应该是相同的.

解决方法

在您将遇到的大多数C/C++实现中,float对应于REAL * 4,而double对应于REAL * 8.

此StackOverflow答案(及相关注释)描述了Fortran 90的类型:Fortran 90 kind parameter.

由于评估顺序不同,可能会出现浮点计算的差异.浮点运算对评估顺序非常敏感,尤其是涉及具有宽动态范围的值之间的加法和减法时.

此外,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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读