Fortran中的“reals”和C中的“浮动”是一样的吗?
我已经将一些代码从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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |