• 検索結果がありません。

第 4 章 数値計算プログラミング 54

B.4 数値データの種類、変数宣言

C

言語には数値を表すために色々なデータ型が使えるが、大きく分けると 整数型

int, char. (signed, unsigned, short, long

などの修飾詞もあり

ます

)

浮動小数点型

float, double, long double

となる。初歩の数値処理プログラミングでは

int

double

さえ知っていればな んとかなるであろう。

int

double,

どういうふうに使い分けるのか?

個数、順番、回数を表す量(整数値しか取らない)を収めるには

int,

その他

(小数部分が必要なもの)

double

としよう。注意すべきは、大は常に小を兼ねるとは限らず、すべてを

double

にす る、などということは出来ない。

(

プログラムの字面上で判断する法

) int

を使っ て表すべきものとして、

配列の添字

ほとんどすべての

for

文のカウンター などがあげられる。

入出力の方法 画面への出力4には

printf()

が、キーボードからの入力5には

scanf()

fgets()

が使える6。その際の書式指定は

int

の場合

“%d” (=decimal)

を使う。

#include <stdio.h>

main() {

int n;

整数型の変数

n

を宣言

scanf("%d", &n);

変数

n

に読み込む

printf("%d \ n", n*n); n*n

の値を出力

}

double

の場合 これは

入力の書式指定には

“%lf”, “%le”, “%lg”

のいずれでも使え る。どれも違いはない。

出力には

(i) “%f”

小数形式で出力する。

(ii) “%e”

指数形式で出力する。

(iii) “%g”

小数形式、指数形式のうち表現が短い方を使って出

力する。

が使る。桁数などもっと細かいことも指定できるが、それは 後述する。

4正確には標準出力への出力。

5正確には標準入力からの入力。

6scanf()については、使うべきでない、という意見が強いが、これについては後述する。

#include <stdio.h>

void test(double);

int main() {

test(1.0);

test(1.23456);

return 0;

}

void test(double A) {

int i;

double a;

a = A;

for (i = 0; i < 10; i++) {

printf("%f %e %g\n", a, a, a);

a *= 10.0;

} a = A;

for (i = 0; i < 10; i++) {

printf("%f %e %g\n", a, a, a);

a /= 10.0;

} }

1.000000 1.000000e+00 1

10.000000 1.000000e+01 10 100.000000 1.000000e+02 100 1000.000000 1.000000e+03 1000 10000.000000 1.000000e+04 10000 100000.000000 1.000000e+05 100000 1000000.000000 1.000000e+06 1e+06 10000000.000000 1.000000e+07 1e+07 100000000.000000 1.000000e+08 1e+08 1000000000.000000 1.000000e+09 1e+09 1.000000 1.000000e+00 1

0.100000 1.000000e-01 0.1 0.010000 1.000000e-02 0.01 0.001000 1.000000e-03 0.001 0.000100 1.000000e-04 0.0001 0.000010 1.000000e-05 1e-05 0.000001 1.000000e-06 1e-06 0.000000 1.000000e-07 1e-07 0.000000 1.000000e-08 1e-08 0.000000 1.000000e-09 1e-09 1.234560 1.234560e+00 1.23456 12.345600 1.234560e+01 12.3456 123.456000 1.234560e+02 123.456 1234.560000 1.234560e+03 1234.56 12345.600000 1.234560e+04 12345.6 123456.000000 1.234560e+05 123456 1234560.000000 1.234560e+06 1.23456e+06 12345600.000000 1.234560e+07 1.23456e+07 123456000.000000 1.234560e+08 1.23456e+08 1234560000.000000 1.234560e+09 1.23456e+09 1.234560 1.234560e+00 1.23456

0.123456 1.234560e-01 0.123456 0.012346 1.234560e-02 0.0123456 0.001235 1.234560e-03 0.00123456 0.000123 1.234560e-04 0.000123456 0.000012 1.234560e-05 1.23456e-05 0.000001 1.234560e-06 1.23456e-06 0.000000 1.234560e-07 1.23456e-07 0.000000 1.234560e-08 1.23456e-08 0.000000 1.234560e-09 1.23456e-09

お勧めの設定

とにかく表示されればいい、という場合は

%g

がお勧め。

1.

複数の数をきれいに並べたい7

2.

計算した精度一杯まで表示したい8 などの場合は、

%

全体の桁数

.

小数部分の桁数

{ f|e|g }

のような指定をする。例えば

%12.5f

とすると、全部で

12

桁の幅、小数点 以下は

5

桁の幅を使うことになる。このとき、全体の桁数は小数の桁数よ

7これは大事なことである。膨大な数を前にしても、人間は案外そこから何かを発見することが 出来るもので、その作業を支援することを馬鹿にしてはいけない。

8C言語で書かれたプログラムは、普通は倍精度計算をしているくせに、「お任せ」にすると単 精度程度しか表示しない。高精度に計算した結果を保存する場合は注意しよう。

り十分大きくするよう注意する必要がある。例えば

%e

で桁数を指定する場 合、

8

桁以上大きくする必要がある。内訳は

符号のための

1

小数点より上の数字のための

1

小数点のための

1

指数部

(“e-128”

のようなやつに最大

)

のための

5

倍精度は

15

桁強あるので、

%23.15e

とすると、計算精度分フルに表示でき ることになる。