Fortran Coder

查看: 11012|回复: 4
打印 上一主题 下一主题

[数值问题] 在用数值中的元素作运算时-1.084202172485504E-019不是零

[复制链接]

28

帖子

10

主题

0

精华

熟手

F 币
140 元
贡献
81 点
跳转到指定楼层
楼主
发表于 2021-4-28 20:24:42 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
运算的代码如下:
[Fortran] 纯文本查看 复制代码
integer, parameter::dp=selected_real_kind(p=15,r=307)
real(kind=dp) ye(4),ze(4)
real(kind=dp) a
ye=(/-0.03_dp,-0.03_dp,-0.03_dp,-0.0265_dp/)
ze=(/-0.03_dp,-0.03_dp,-0.03_dp,-0.0265_dp/)
a=ye(3)*ze(2)+ye(2)*ze(4)+ye(4)*ze(3)-ye(3)*ze(4)-ye(2)*ze(3)-ye(4)*ze(2)b=ye(1)*ze(4)+ye(4)*ze(2)+ye(2)*ze(1)-ye(1)*ze(2)-ye(4)*ze(1)-ye(2)*ze(4)


得出的结果是:
a=-1.084202172485504E-019
b=0.000000000000000E+000


为什么不都是0呢?



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

5#
发表于 2021-4-29 07:59:23 | 只看该作者
实数不要做=0的比较

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

地板
发表于 2021-4-28 23:46:22 | 只看该作者
本帖最后由 风平老涡 于 2021-4-28 23:55 编辑
Proteus 发表于 2021-4-28 21:15
那这个误差会影响后面的计算吗?

会的。ye, ze和a都是12位的精度,大于12位精度的数字都是无效数。所以a等同于0。要特别注意相同大小的数值相减, 很可能会掉精度。

28

帖子

10

主题

0

精华

熟手

F 币
140 元
贡献
81 点
板凳
 楼主| 发表于 2021-4-28 21:15:57 | 只看该作者

那这个误差会影响后面的计算吗?

834

帖子

2

主题

0

精华

大宗师

F 币
3922 元
贡献
2332 点
沙发
发表于 2021-4-28 20:59:34 | 只看该作者
实数有误差。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-1 07:41

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表