アポストロフィ(')で挟まれた文字列を文字定数という. 例:'hoge'
文字定数を格納するためには「文字型」の変数を宣言する必要がある.
文字型宣言文 | character a*10, b(2,2)*5,c |
a,b,c | 変数, 配列, 関数副プログラム名 |
---|---|
*10, *5 | 文字数の指定 |
implicit none character a*5 a='hoge' write(6,*) a end
スラッシュを二つ(//)書くことで 文字型変数や定数を連結することができる.
例:implicit none character a*5,b*10 a='hoge' b=a//'hoge' write(6,*) b end
文字列の一部を指定することができる. a(m:n)によって変数aの第m文字目からn文字目を表す. 配列の場合, a(k)(m:n)とすると, k番目の配列要素のm文字目からn文字目を指定する.
例:implicit none character x*10,y*4,z(3)*5 x='0123456789' y=x(3:6) z(1)(3:5)=x(1:3) write(6,*) x,' ',y,' ',z(1) end
関数名 | 意味 |
char(整数) | 整数値を文字に変換. I=0〜255の値から, その値に対応する文字に変換する. |
---|---|
ichar(文字型変数, もしくは文字定数) | 文字をコード表に対応する整数値に変換. |
index(a,b) | 文字列a中にある文字列bの位置(整数). 文字列bが見付からない場合は0を返す. |
len(文字型変数, もしくは文字定数) | 文字列aの長さ(整数). |
implicit none character a*10,b integer n,m,k a='abcdefghi' b=char(100) n=ichar('d') m=index(a,'de') k=len(a) write(6,*) b,n,m,k end
文字と整数値との間にはコード表によって対応関係がある. この整数値を用いて異なる文字の間の大小関係を定める. 比較には.eq., .ne., .gt., .ge., .lt., .le.を用いる.
例:implicit none character a,b a='c' b='c' if(a.eq.b) write(6,*) a,b end
同様にして, 文字列の大小の比較が行われる. 文字列の先頭の文字が異なる場合, それらの文字同士の大小で文字列の大小を定める. 先頭の文字が同じ場合, 二文字目以降で最初に異なる文字の大小で大小関係を定める. 文字列の長さが異なる場合, 短い方の文字列の後ろに空白文字を付け加えて比較する. 空白文字の整数値は32で, どの英数字よりも小さい.
例: ABA□□ < ABC□□ < ABCDE計算機はミクロにはon,offの2状態しか扱うことができない. したがって計算機が計算し ている「数」は実際にはすべて2進数である. そこで計算機の内部で数がどう表されてい るか考えてみよう. ここではまず整数を考える.
簡単のために3ビットの計算機を考えよう. つまりこの計算機で取り扱えるのは3個の0, 1 の組である. 3ビット計算機は次の表に表されるように整数を取り扱う.
符合のための1bit | 数値のための2bits | 表される整数 | 0 | 11 | 3 | 0 | 10 | 2 | 0 | 01 | 1 | 0 | 00 | 0 | 1 | 11 | -1(1に対する2の補数) | 1 | 10 | -2(2に対する2の補数) | 1 | 01 | -3(3に対する2の補数) | 1 | 00 | -4=2の(3-1)乗 |
---|
この表から推測されるように, nビット計算機で取り扱える数は2の(n-1)乗-1 からマイナス2の(n-1)乗までとなる. 次のプログラムを実行してみよ.
implicit none integer n,m,k n=2147483647 m=n+1 k=m+n+1 write(6,*) n,m,k end
このプログラムはどうなるであろうか?
implicit none integer n,m,k n=2147483648 m=n+1 k=m+n+1 write(6,*) n,m,k end
現在流通している多くのコンピューターは32ビット計算機である.これは,内
部で扱う数値を32個の0と1で表現しているということである.
仮数部の符号1bit | 指数部の8bits | 仮数部(23bits) | 0 | 00000000 | 00000000000000000000000 |
---|
仮数部の符号1bit | 指数部の11bits | 仮数部(52bits) | 0 | 00000000000 | 00000000000000000000000.. |
---|
1bitはプラスかマイナスの符号につかう.8bitsを指数部に使う(倍精度の場合11bits).8個の0と1で-126から+127までの数を表す(倍精度の場合-1022から1023まで). ここからフォートランで用いることができる数値は2の127乗=10の38乗まで(倍精度の場合10の308乗まで)ということになる.
残りの23個(倍精度の場合52個)を使って仮数部(0.234E5 だったら 0.234の部分)を表す.小数第1桁目は1とき まっているので表現はしないため実質2進数で24桁(倍精度の場合53桁)ということになる. 24桁なの で仮数部で表せるもっとも小さな数は2の-24乗=0.6*10^(-7)(倍精度の場合0.1*10^(-15))となる.このこ とから数値的な誤差が発生する. 次のプログラムを実行させてみよう.implicit none real*8 a,b,c,d,e a=1.D-15 b=1.D-16 c=1.D0 d=c+a e=c+b write(6,"(3E26.18)") a,b,c,d,e end結果はどうなったであろうか? これが誤差を生み出す原因である.ここで見ら れる誤差は二つあって
![]() |
(1) |
![]() |
(2) |
![]() |
(3) |
![]() |
(4) |
![]() |
![]() |
![]() |
|
![]() |
![]() |
(5) |
![]() |
(6) |
![]() |
(8) |
![]() |
(9) |
![]() |
![]() |
![]() |
|
![]() |
![]() |
(10) |
![]() |
![]() |
![]() |
|
![]() |
![]() |
(11) |