好好干 发表于 2023-12-12 16:05:16

数据类型转换

各位大佬们,你们好。
我有一个程序,如下:
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,这个结果在后面的程序中会被使用,精度损失的话会有影响。

fcode 发表于 2023-12-12 21:10:11

因为单精度浮点数,只有7位左右的有效位数。你需要双精度。

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

好好干 发表于 2023-12-13 09:02:50

fcode 发表于 2023-12-12 21:10
因为单精度浮点数,只有7位左右的有效位数。你需要双精度。

program test


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

Transpose 发表于 2023-12-13 09:26:22

字面值0.1也是有精度的,默认是单精度,0.1d0是双精度

好好干 发表于 2023-12-13 10:26:20

Transpose 发表于 2023-12-13 09:26
字面值0.1也是有精度的,默认是单精度,0.1d0是双精度

感谢指导,明白了:-lol

fcode 发表于 2023-12-14 08:38:34

补充一下,
0.1d0 是 0.1e0 的双精度版本。是指数类型的字面值。

也可以用 0.1_8 这种形式。_8 说明 kind=8 的 0.1
页: [1]
查看完整版本: 数据类型转换