第 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.
複数の数をきれいに並べたい72.
計算した精度一杯まで表示したい8 などの場合は、%
全体の桁数.
小数部分の桁数{ f|e|g }
のような指定をする。例えば
%12.5f
とすると、全部で12
桁の幅、小数点 以下は5
桁の幅を使うことになる。このとき、全体の桁数は小数の桁数よ7これは大事なことである。膨大な数を前にしても、人間は案外そこから何かを発見することが 出来るもので、その作業を支援することを馬鹿にしてはいけない。
8C言語で書かれたプログラムは、普通は倍精度計算をしているくせに、「お任せ」にすると単 精度程度しか表示しない。高精度に計算した結果を保存する場合は注意しよう。
り十分大きくするよう注意する必要がある。例えば
%e
で桁数を指定する場 合、8
桁以上大きくする必要がある。内訳は–
符号のための1
桁–
小数点より上の数字のための1
桁–
小数点のための1
桁–
指数部(“e-128”
のようなやつに最大)
のための5
桁倍精度は