getc

getcは、指定されたストリームから、文字を取得する。

Man page of FGETC
C言語関数辞典 - getc

標準入力と、ファイルから、それぞれ文字を取得してみる。

test1.txtに"A"だけ書いておく。

$ cat test1.txt
A
$ vi getc.c
$ gcc getc.c -o getc
$ ./getc
stdin: X
stdin: c = X
fp: c = A
[bg1@localhost getc]$

先に標準入力で'X'を入力すると、'X'がgetcで取得されて、cに格納されるので、cを出力。
そのあと、test1.txtから1文字読み込み、cに格納されるので、cを出力。

getcはfgetc(後述)と違い、マクロで実装してもいいことになっている。
マクロだと、

C言語関係掲示板 過去ログ962

このように、インクリメントなどで副作用が起こる式だと2回以上評価される可能性があるため、問題である。
ただ、

サービス情報システム(C言語には関数が存在しないという迷言) - ncaq

glibcはマクロではなさそう。
こちらでも試したが、2回評価されるような現象はみられなかった。

Sample/c/getc/getc/src/getc at master · bg1bgst333/Sample · GitHub

srand

srandは、疑似乱数のシード(乱数種)を変更する。

Man page of RAND
C言語関数辞典 - C言語Tips集 擬似乱数を発生させる

疑似乱数を作るのに使われるのが、シードと呼ばれる値で、これが毎回違うと、毎回違う乱数のパターンになる。

今回は、実行時にtimeの戻り値をsrandに渡すことで、毎回違うパターンの乱数ができるかを試してみる。

$ vi srand.c
$ gcc -lm srand.c -o srand
$ ./srand
 4  5 30 58 93 67 49  8 57 10
46 26 83 97 84 16 20 70 77 12
32 27 22 46  0 75 54  4 49 95
98  5  0 28 63 94 47 12 54 57
75  1 83 58 98 19 27 70 90  4
35 74 32 57 73 32 32 27 88 33
23 38 39 75 67  2 69 66 67 24
23 42 25 59 52 75 78 79 46 20
36 81 47 68 38 20 52 22 99 92
55 22 30 94 50 49 49 19 16 16
$ ./srand
40 39 78 96 55 27 57 79 32 30
76 91 78 76  6  0 66  8 48 79
53 49 37  1 64 69 15 37 30 71
13 71 62 43 19 18 23 77 97  7
59 25 99 37  1 57 90 67 65 38
98 71 40 35 24 56 57 39 93 87
62  7 10 25  2 30 95 25 59 44
33 18 69 84 55 70 41 97 38 59
88 36 82 28 24  6 84 33 45 77
20 60 36 83 85 39 13 32 16 24
$ ./srand
38 43 25 82 73 33 19 93  1 88
41 88 68 61 66 22 87 70 60 69
21 87 80  9 87 91 21 90 15 19
81  5 14 58 40 87 92 11 33 93
51 74 33 72 87 51 94 74 21 54
43 94 94 75  4 81 67 77 24 34
49 57 91 15 15 31 55 59 43 88
 4 46 14 89 18  2 40 13 76 13
67 72 60 61 47 16 95 66 45 71
 0 46 28 92 62 43 75 17 55 70
$

最初、4で始まって、次に40から始まり、3つ目は38から始まりなので、毎回変わっていることがわかる。

Sample/c/srand/srand/src/srand at master · bg1bgst333/Sample · GitHub

rand

randは、疑似乱数を発生させる。

Man page of RAND
C言語関数辞典 - C言語Tips集 擬似乱数を発生させる

戻り値として、0以上、RAND_MAX以下の整数をランダムに返す。
RAND_MAXまでいらない場合は、戻り値をとある数nで割った余りを求めれば、0からn - 1までの乱数となる。

0から99までの乱数を出力。
見やすくするために、iが10の倍数の時だけ、改行するようにしてある。

$ vi rand.c
$ gcc rand.c -o rand
$ ./rand
83 86 77 15 93 35 86 92 49 21
62 27 90 59 63 26 40 26 72 36
11 68 67 29 82 30 62 23 67 35
29  2 22 58 69 67 93 56 11 42
29 73 21 19 84 37 98 24 15 70
13 26 91 80 56 73 62 70 96 81
 5 25 84 27 36  5 46 29 13 57
24 95 82 45 14 67 34 64 43 50
87  8 76 78 88 84  3 51 54 99
32 60 76 68 39 12 26 86 94 39
$ ./rand
83 86 77 15 93 35 86 92 49 21
62 27 90 59 63 26 40 26 72 36
11 68 67 29 82 30 62 23 67 35
29  2 22 58 69 67 93 56 11 42
29 73 21 19 84 37 98 24 15 70
13 26 91 80 56 73 62 70 96 81
 5 25 84 27 36  5 46 29 13 57
24 95 82 45 14 67 34 64 43 50
87  8 76 78 88 84  3 51 54 99
32 60 76 68 39 12 26 86 94 39
$

確かに、100個の乱数を出力できた。
ただし、何度実行しても同じパターンになってしまう。
それによくみると、一様乱数にはなっていない。

Sample/c/rand/rand/src/rand at master · bg1bgst333/Sample · GitHub

ceil

実数xに対して、xより小さくない最小の整数を返す関数を天井関数という。

天井関数

ceilは、天井関数の計算を行う。

Man page of CEIL
C言語関数辞典 - ceil, ceilf, ceill

つまり、切り上げである。
負の数の場合、例えば-4.5なら、-4に切り上がる。


$ vi ceil.c
$ gcc -lm ceil.c -o ceil
$ ./ceil
x: 0.1
c = 1.000000
$ ./ceil
x: 2.0
c = 2.000000
$ ./ceil
x: 2.9
c = 3.000000
$ ./ceil
x: -4.5
c = -4.000000
$ ./ceil
x: -5.9
c = -5.000000
$ ./ceil
x: -6
c = -6.000000
$

こうなる。

Sample/c/ceil/ceil/src/ceil at master · bg1bgst333/Sample · GitHub

floor

実数xに対して、xを超えない最大の整数を、ガウス記号"[]"を使って、"[x]"と記述することがある。
引数xに対して、このような整数を返す関数を床関数という。

床関数

floorは、床関数の計算を行う。

Man page of FLOOR
C言語関数辞典 - floor, floorf, floorl

要は、小数点以下の切り捨て。
ただし、負の整数の場合も、xを超えない最大の整数を返すため、切り捨てではなく、より小さい整数値を返す。(-2.3なら-3を返す。)


$ vi floor.c
$ gcc -lm floor.c -o floor
$ ./floor
x: 0.0001
f = 0.000000
$ ./floor
x: 1.99995
f = 1.000000
$ ./floor
x: 2.3
f = 2.000000
$ ./floor
x: 3.8
f = 3.000000
$ ./floor
x: 4
f = 4.000000
$ ./floor
x: -2.3
f = -3.000000
$

このようになる。

Sample/c/floor/floor/src/floor at master · bg1bgst333/Sample · GitHub

atan

atanは、逆正接値を計算する。

Man page of ATAN
C言語関数辞典 - atan, atanf, atanl

つまり、tanの値から、角度のラジアン値を計算するということ。

acosと同様に、tanの値を引数として渡すと、ラジアン値が戻り値として返る。

$ vi atan.c
$ gcc -lm atan.c -o atan
$ ./atan
rad_0 = 0.000000
rad_30 = 0.523599
rad_45 = 0.785398
rad_60 = 1.047198
rad_90 = 1.570796

val_30 = 0.577350
val_45 = 1.000000
val_60 = 1.732051

atan(0) = 0.000000
atan(val_30) = 0.523599
atan(val_45) = 0.785398
atan(val_60) = 1.047198
atan(16331239353195370) = 1.570796
$

tan90°の値も一応渡してみた・・・。たしかに一緒だが・・・。

Sample/c/atan/atan/src/atan at master · bg1bgst333/Sample · GitHub

acos

acosは、逆余弦値を計算する。

Man page of ACOS
C言語関数辞典 - C言語Tips集 アークコサイン(逆余弦)を計算する

つまり、cosの値から、角度のラジアン値を計算するということ。

asinと同様に、cosの値を引数として渡すと、ラジアン値が戻り値として返る。

$ vi acos.c
$ gcc -lm acos.c -o acos
$ ./acos
rad_0 = 0.000000
rad_30 = 0.523599
rad_45 = 0.785398
rad_60 = 1.047198
rad_90 = 1.570796

val_30 = 0.866025
val_45 = 0.707107
val_60 = 0.500000

acos(1) = 0.000000
acos(val_30) = 0.523599
acos(val_45) = 0.785398
acos(val_60) = 1.047198
acos(0) = 1.570796
$

このようになる。

Sample/c/acos/acos/src/acos at master · bg1bgst333/Sample · GitHub