数据类型转换
各位大佬们,你们好。我有一个程序,如下:
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,这个结果在后面的程序中会被使用,精度损失的话会有影响。
因为单精度浮点数,只有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 fcode 发表于 2023-12-12 21:10
因为单精度浮点数,只有7位左右的有效位数。你需要双精度。
program test
使用您的代码运行测试成功。感谢大佬指点。另外请问下,为什么slope这个值,前面已经给出了kind=8,为什么还需要在0.1后面加d0,?我尝试把d0去掉后,结果就不对了。d0在这里起的是什么作用呢?谢谢 字面值0.1也是有精度的,默认是单精度,0.1d0是双精度 Transpose 发表于 2023-12-13 09:26
字面值0.1也是有精度的,默认是单精度,0.1d0是双精度
感谢指导,明白了:-lol 补充一下,
0.1d0 是 0.1e0 的双精度版本。是指数类型的字面值。
也可以用 0.1_8 这种形式。_8 说明 kind=8 的 0.1
页:
[1]