Fortran编程:(三)数据类型

一、数据类型

在C++中,其数据类型有布尔型(bool)、字符型(char)、整型(int)、浮点型(float)、双浮点型(double)等,并且一些基本类型可以使用一个或多个类型修饰符(signed、unsigned、short、long)进行修饰,使得C++具有丰富的数据类型。

相比于C++,Fortran中的数据类型有整型(integer、实型real、复数型complex、逻辑型logical、字符型character等,没有类似于C++中的修饰符。

由于C++中可通过修饰符控制变量的精度范围,类似地,在Fortran中,可通过Kind值来控制精度范围。

二、Kind值

Kind 的正式名称叫“种别”,是区分同一种数据类型,但不同长度、或精度、或编码方式的一种代号。他在编译时决定!Kind 受编译器的影响,具体数值可能会有差异。Kind 对不同的变量类型,表达的意思也不相同。

对 Integer ,Kind 值影响整数能表达的最大范围;对 Real 和 Complex, Kind 值影响实数的最大范围和最小精度;对 Character ,Kind 值表示编码。通常为 ASCII 编码;对 Logical , Kind 值表示长度,对逻辑型无影响。

(1)Integer的Kind值

对于Integer来说,其Kind值一般为1、2、4、8,对于大多数编译器,Kind 默认是 4,占有 4 个字节。

不同的Kind值,其取值范围不一样。

Kind值 1 2 4 8
类型 超短整型 短整型 整型 超长整型
取值范围 -2^7~2^7-1

-2^15~2^15-1

-2^31~2^31-1 -2^63~2^63-1

由于某些编译器不支持Kind=8, Kind=1 ,而某些编译器用1、2、3、4 表示,为了代码的适用性和统一性,可以使用函数Selected_Int_Kind,即k = Selected_Int_Kind( i )  来选择能满足要求的Kind,其中i 表示需要最大的十进制位数,k 表示返回的能满足范围的最小的Kind值。

(2)Real的Kind值

对于Real来说,其Kind值一般为4、8、16,对于大多数编译器,Kind 默认是 4,占有 4 个字节。

不同的Kind值,其取值范围不一样。

由于某些编译器不支持Kind=16,而某些编译器用1、2、3表示,为了代码的适用性和统一性,可以使用函数Selected_Real_Kind,即k = Selected_Real_Kind(r,p)  来选择能满足要求的Kind,其中r 表示需要最大的十进制位数 , p 表示最小的有效位数,k 表示返回的能满足范围的最小的Kind值。

(3)Complex的Kind值

Complex 的数据类型与 Real 一致。

但需要注意的是:如果 Kind=8 的 Real 占用 8 字节,则 Kind=8 的 Complex 占有 16 字节,很多人使用 Complex(Kind=16) 来定义双精度,实际上,这已经是四精度了。

Complex 选择Kind,也使用 Selected_Real_Kind 函数

(4)Character的Kind值

Character 的 Kind,常见只有一种,即 1 表示 ASCII 编码,通常忽略。

也可以使用 Selected_Char_Kind 来选择,即k = Selected_Char_Kind( 'ASCII' )。

(5)Logical的Kind值

Logical 的 Kind,通常与该编译器支持的 Integer 一致,通常忽略,在大多数编译器上,Kind=4,占有4字节。

任何 Kind 值的 Logical 都只能表示真、假两个状态。

Logical 没有可以选择Kind值的函数。通常只有在混编时,才会需要更改 Kind 值。

三、各种数据类型的简单使用

如下代码简单的进行数据类型的测试:

program test
implicit none
integer,parameter::ip = Selected_Int_Kind(8)
integer,parameter::dp = Selected_Real_Kind(15,6)
character(len=20)::cform
integer(kind=ip)::i=0,j
real(kind=dp)::r1=1.,r2=2.
complex(kind=dp)::cmplx1
logical::l1=.true.

cmplx1=cmplx(r1,r2)  !定义复数
write(*,*) '------------------------------------//Test Character'
do j=1,3,1
    write(cform,*) j
    write(*,*) 'My file is ','File_Number_'//trim(adjustl(cform))//'.txt'!可用//进行字符串连接
end do
write(*,*) '------------------------------------//Test Integer'
write(*,*) 'The kind value of i is',kind(i)
write(*,*) 'The  max value of i is',huge(i)
write(*,*) '------------------------------------//Test Real'
write(*,*) 'The kind value of r1 is',kind(r1)
write(*,*) 'The  max value of r1 is',huge(r1)
write(*,*) '------------------------------------//Test Complex'
write(*,*) 'The complex number is',cmplx1
write(*,*) 'The real part of complex number is',real(cmplx1)
write(*,*) 'The imag part of complex number is',imag(cmplx1)
write(*,*) '------------------------------------//Test Logical'

if(l1) write(*,*) 'I am true ! ^&^'

end program test

运行结果为:

此外,对于实型/浮点数而言,一般不做相等判断,因为浮点数存在有效位数,进行相等判断时,有时往往会超出预期,造成严重数值计算错误的后果。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读