Fortran Coder

查看: 844|回复: 7
打印 上一主题 下一主题

[通用算法] 数据累加误差

[复制链接]

258

帖子

0

主题

0

精华

版主

World Analyser

F 币
713 元
贡献
508 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
楼主
发表于 2024-4-30 09:43:23 | 显示全部楼层
本帖最后由 kyra 于 2024-4-30 09:44 编辑

REAL (KIND=dp) :: inc = 31.494732290178_dp
这是 Fortran 新手很容易弄错的一点,Fortran 中不仅变量有 kind 值,常量也有。尤其对双精度的浮点数需要特别注意。

258

帖子

0

主题

0

精华

版主

World Analyser

F 币
713 元
贡献
508 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
沙发
发表于 2024-4-30 15:05:08 | 显示全部楼层
变量申明的时候 real(kind=dp) :: arr 就行了。
常量才用 _dp 的形式。

258

帖子

0

主题

0

精华

版主

World Analyser

F 币
713 元
贡献
508 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
板凳
发表于 2024-5-5 17:15:05 | 显示全部楼层
0.748705380
0.74870537999999998
这两个数字相比,已经有15位有效数字了。符合你 dp = SELECTED_REAL_KIND(15,14) 的预期。
你还想继续增加有效数字,可以看看你的编译器是否支持双双精度(四精度) dp = SELECTED_REAL_KIND(20,14)

不管怎么样,计算机的资源是有限的,是无法做到无限精度的。
就好像十进制无法准确的表达 1/3 一样,只能用 0.333333333 近似。
你可以了解一下 IEEE 浮点数规则的原理。

258

帖子

0

主题

0

精华

版主

World Analyser

F 币
713 元
贡献
508 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
地板
发表于 2024-5-8 13:35:54 | 显示全部楼层
没法控制,计算机使用二进制,而不是十进制。
就像三进制计算 1/3 * 3 = 1 是准确的。但十进制就可能是 0.333333 * 3 = 0.999999 不一定准确。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-6-13 15:53

Powered by Tencent X3.4

© 2013-2024 Tencent

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