截断有效数字
例如,双精度数字,a =1.12346789012345我想让 b 等于a的前14位有效数字,也即是b=1.123467890123Fortran有没有函数实现这个功能啊
real(8) :: a = 1.12346789012345d0
real(8) :: b
character(len=24) :: tmp
write(tmp,"(es22.12e3)") a
read(tmp,"(es22.12e3)") b 好的,谢谢您 本帖最后由 kyra 于 2025-1-22 17:12 编辑
kyra 发表于 2025-1-22 15:35
real(8) :: a = 1.12346789012345d0
real(8) :: b
character(len=24) :: tmp
您好,我想再问下
program write_to_eff
implicit none
real(8) :: a
real(8) :: b
character(len=24) :: tmp
a = 1.12346789012345d0
write(tmp,"(es22.12)") a
read(tmp,"(es22.12)") b
write(*,*) b
pause
end program执行后屏幕输出的结果是: 1.12346789012300
将程序修改,将a后面的d0去掉,如下:
program write_to_eff
implicit none
real(8) :: a
real(8) :: b
character(len=24) :: tmp
a = 1.12346789012345
write(tmp,"(es22.12)") a
read(tmp,"(es22.12)") b
write(*,*) b
pause
end program
执行后屏幕输出的结果是: 1.12346792221100
因为我实际用的时候没办法加d0,但是我想要第一种输出结果
,应该怎么处理啊
bfjc 发表于 2025-1-22 17:01
您好,我想再问下
program write_to_eff
implicit none
感觉不加d0的话,好像write是按单精度识别的,但是我定义的是双精度 Fortran 的常数也有精度。
对大部分编译器,默认情况下 1.12346789012345 是单精度的(默认精度)。
而 1.12346789012345d0 才是双精度的。
和 write 无关。
a 虽然是双精度,但 1.12346789012345 是单精度。把单精度的数值赋给双精度的变量,精度只有单精度。
某些编译器可以设置“默认精度”,通过一定的编译选项实现。 kyra 发表于 2025-1-22 17:11
Fortran 的常数也有精度。
对大部分编译器,默认情况下 1.12346789012345 是单精度的(默认精度)。
好的,明白您的意思了,谢谢
页:
[1]