Fortran Coder

查看: 478|回复: 5
打印 上一主题 下一主题

[数值问题] 数据类型转换

[复制链接]

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

跳转到指定楼层
楼主
发表于 2023-12-12 16:05:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬们,你们好。
我有一个程序,如下:
[Fortran] 纯文本查看 复制代码
program test

    implicit none
    integer :: a = 509232994    ! 毫秒数
    real :: slope = 0.1
    real :: b

    b = a *slope

    print *, a, b
    write (*, fmt = '(F12.1)') b

end program test



执行程序后,输出b的结果均不是50923299.4,而是50923300.0。请问这个是什么原因,该如何解决?其中a是从HDF文件读取出来的,其在HDF5文件中的类型是H5T_NATIVE_INTEGER,利用call H5Dread_f(dhnd, H5T_NATIVE_INTEGER, a, szst, iret)读取。如何在不修改a为整型情况下,得到正确的50923299.4,这个结果在后面的程序中会被使用,精度损失的话会有影响。
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2023-12-12 21:10:11 | 只看该作者
因为单精度浮点数,只有7位左右的有效位数。你需要双精度。

[Fortran] 纯文本查看 复制代码
program test
  implicit none
  integer :: a = 509232994    ! 毫秒数
  real(kind=8) :: slope = 0.1d0
  real(kind=8) :: b
  b = a *slope
  print *, a, b
  write (*, fmt = '(F12.1)') b
end program test

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

板凳
 楼主| 发表于 2023-12-13 09:02:50 | 只看该作者
fcode 发表于 2023-12-12 21:10
因为单精度浮点数,只有7位左右的有效位数。你需要双精度。

[mw_shl_code=fortran,true]program test

使用您的代码运行测试成功。感谢大佬指点。另外请问下,为什么slope这个值,前面已经给出了kind=8,为什么还需要在0.1后面加d0,?我尝试把d0去掉后,结果就不对了。d0在这里起的是什么作用呢?谢谢

159

帖子

2

主题

1

精华

大师

Vim

F 币
961 元
贡献
469 点

规矩勋章

地板
发表于 2023-12-13 09:26:22 | 只看该作者
字面值0.1也是有精度的,默认是单精度,0.1d0是双精度

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

5#
 楼主| 发表于 2023-12-13 10:26:20 | 只看该作者
Transpose 发表于 2023-12-13 09:26
字面值0.1也是有精度的,默认是单精度,0.1d0是双精度

感谢指导,明白了

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

6#
发表于 2023-12-14 08:38:34 | 只看该作者
补充一下,
0.1d0 是 0.1e0 的双精度版本。是指数类型的字面值。

也可以用 0.1_8 这种形式。_8 说明 kind=8 的 0.1
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-2 21:35

Powered by Tencent X3.4

© 2013-2024 Tencent

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