Fortran:数字

声明:本博文翻译自:https://www.tutorialspoint.com/fortran/fortran_numbers.htm

前面有博文介绍过有关内容,所以这里重复的内容不在累赘。[重复内容](https://blog.csdn.net/chd_lkl/article/details/82108265)

1. 这里直接从复数的相关运算讲起。
看如下代码:
Program ComplexArithmatic
  implicit none
   complex, parameter :: i = (0, 1)   !.. sqrt(-1)   
   complex :: x, y, z 

   x = (7, 8); 
   y = (5, -7)   
   write(*,*) i * x * y

   z = x + y
   write(*,'(1x,a,g0)') "z = x + y = ", z

   z = x - y
   write(*,'(1x,a,g0)') "z = x - y = ", z 

   z = x * y
   write(*,'(1x,a,g0)') "z = x * y = ", z 

   z = x / y
   write(*,'(1x,a,g0)') "z = x / y = ", z 

End program ComplexArithmatic
用ivf,执行结果如下:
 (9.000000,91.00000)
 z = x + y =  (12.00000,1.000000)
 z = x - y =  (2.000000,15.00000)
 z = x * y =  (91.00000,-9.000000)
 z = x / y =  (-0.2837838,1.202703)

2. 数字的范围,精度和大小
整数的范围、浮点数的精度和大小取决于分配给特定数据类型的比特数。
下表显示整数的位数和范围
Number of bits          Maximum value           Reason
      64         9,223,372,036,854,774,807    (2**63)–1
      32              2,147,483,647           (2**31)–1

下表显示了比特数、以及实数的最小值,最大值和精度。
Number of bits          Largest value           Smallest value          Precision
     64                    0.8E+308                0.5E–308               1518
     32                     1.7E+38                 0.3E–38                6-9

下面的代码将提示报错:
Program rangePrecision
  implicit none
  real:: x, y, z
  x = 1.5e+40  !.. 如果想赋值成功,需要声明成kind=8
  y = 3.73e+40
  z = x * y 
  print *, z  !.. 在ivf下,z为Infinity

End program rangePrecision

接下来换一个小一点的数
program rangePrecision
  implicit none

   real:: x, y, z
   x = 1.5e+20  !.. kind=4可以满足
   y = 3.73e+20
   z = x * y 
   print *, z
   z = x/y
   print *, z

end program rangePrecision
在ivf下执行,结果如下:
Infinity
0.4021448
可以看到,这次x,y的赋值并没有超出范围,但是z=x*y超出存储范围;而z=x/y并没有超出范围。
所以在编程中对数据范围要求比较大时,建议声明成双精度变量。
同理,当声明的变量的kind值一定时,数太小也是会出错的。

3. 类型说明符
在科学编程中,人们常常需要知道进行工作的硬件平台的数据范围和精度。
内置函数kind()允许您在运行程序之前查询硬件数据表示的详细信息。
Program kindCheck
  implicit none

  integer :: i 
  real :: r 
  complex :: cp 
  character :: c 
  logical :: lg 

  write(*,'(1x,a,g0)') 'integer ', kind(i) 
  write(*,'(1x,a,g0)') 'real ', kind(r) 
  write(*,'(1x,a,g0)') 'complex ', kind(cp) 
  write(*,'(1x,a,g0)') 'character ', kind(c) 
  write(*,'(1x,a,g0)') 'logical ', kind(lg) 

End program kindCheck
在ivf下执行上面的代码,结果如下:
integer 4
real 4
complex 4
character 1
logical 4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值