bfjc 发表于 2025-1-22 11:46:54

截断有效数字

例如,双精度数字,a =1.12346789012345我想让 b 等于a的前14位有效数字,也即是b=1.123467890123
Fortran有没有函数实现这个功能啊

kyra 发表于 2025-1-22 15:35:18

real(8) :: a = 1.12346789012345d0
real(8) :: b
character(len=24) :: tmp
write(tmp,"(es22.12e3)") a
read(tmp,"(es22.12e3)") b

bfjc 发表于 2025-1-22 15:54:40

好的,谢谢您

bfjc 发表于 2025-1-22 17:01:20

本帖最后由 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:05:19

bfjc 发表于 2025-1-22 17:01
您好,我想再问下
      program write_to_eff
      implicit none


感觉不加d0的话,好像write是按单精度识别的,但是我定义的是双精度

kyra 发表于 2025-1-22 17:11:50

Fortran 的常数也有精度。

对大部分编译器,默认情况下 1.12346789012345 是单精度的(默认精度)。
而 1.12346789012345d0 才是双精度的。

和 write 无关。

a 虽然是双精度,但 1.12346789012345 是单精度。把单精度的数值赋给双精度的变量,精度只有单精度。

某些编译器可以设置“默认精度”,通过一定的编译选项实现。

bfjc 发表于 2025-1-22 17:23:13

kyra 发表于 2025-1-22 17:11
Fortran 的常数也有精度。

对大部分编译器,默认情况下 1.12346789012345 是单精度的(默认精度)。


好的,明白您的意思了,谢谢
页: [1]
查看完整版本: 截断有效数字