計算してみよう

簡単な計算

次のプログラムは 12.3 + 45.6 という計算をして結果を出力します。

class Keisan {
    public static void main(String[] args) {
        System.out.println(12.3 + 45.6);
    }
}

コンパイルして実行してみると,

57.9

と画面に出力されます。

また,

答えは 57.9 です。

と画面に出力するには,次のようにします。

class Keisan {
    public static void main(String[] args) {
        System.out.println("答えは " + (12.3 + 45.6) + " です。");
    }
}

ここでは「+」の記号が三つ使ってあります。真ん中の

        (12.3 + 45.6)

が,実際に足し算をする部分です。この結果は 57.9 ですから,この命令全体は

        System.out.println("答えは " + 57.9 + " です。");

と書くのと同じことになります。この 57.9 の両側の + は,数の足し算ではなく,単に文字列をつなぎ合わせるだけです。 最終的には

        System.out.println("答えは 57.9 です。");

と書いたのと同じことになります。

もし間違って

        System.out.println("答えは " + 12.3 + 45.6 + " です。");

としてしまったら,画面には

答えは 12.345.6 です。

のように,単に文字列としてつなぎ合わせたものが出てしまいます。

Java言語の計算では,C言語などと同様に,掛け算は *,割り算は / で表します。また,通常の計算と同じように,次の順番で計算をします。

  1. かっこ ( ) の中
  2. 掛け算・割り算 a * ba / b
  3. 足し算・引き算 a + ba - b

注意すべき点は,整数どうしの計算なら,答えも切り捨てて整数にされてしまうことです。たとえば

        System.out.println("答えは " + (8 / 3) + " です。");

の答えは 2.666… にならず,切り捨てて 2 になってしまいます。切り捨てられたくなければ,

        System.out.println("答えは " + (8.0 / 3) + " です。");

のように,どちらかの数(または両方)に小数点を付けます。

上のプログラムは「答えは 2.6666666666666665 です。」と出力します。末位の数字は正しくないかもしれません(この場合は明らかに正しくありません)。

以上で,Javaの計算の基本は終わりです。このレッスンの残りは,さらに詳しく知りたい人のためのものです。

指数表示

小数点の付いた非常に大きい値や非常に小さい値は,指数表示になります。たとえば

        System.out.println(314159265357989.0);

とすると,

3.14159265357989E14

と出力されます。この3.14159……E14は 3.14159……×1014 の意味です。言い換えれば,E14は小数点を右に14個動かすことです。また

        System.out.println(0.00000314159265357989);

とすると,

3.14159265357989E-6

と出力されます。この3.14159……E-6は 3.14159……×10-6 の意味です。言い換えれば,E-6は小数点を左に6個動かすことです。

数学関数

次のプログラムは2の平方根を計算して出力します。

class Test {
    public static void main(String[] args) {
        System.out.println("ルート2は " + Math.sqrt(2.0) + "です。");
    }
}

実行すると

ルート2は 1.4142135623730951 です。

と画面に現れます。

Math.sqrt() が平方根を求める関数です。これ以外にも次のようなたくさんの関数が使えます。

次のものは引数も含めすべて double 型です。角度の単位はすべてラジアンです。

Math.E
自然対数の底 2.7182818284590452354
Math.PI
円周率 3.14159265358979323846
Math.sin(a)
サイン
Math.cos(a)
コサイン
Math.tan(a)
タンジェント
Math.asin(a)
アークサイン
Math.acos(a)
アークコサイン
Math.atan(a)
アークタンジェント
Math.exp(a)
指数関数
Math.log(a)
対数関数
Math.sqrt(a)
平方根
Math.IEEEremainder(f1, f2)
f1÷f2 の剰余
Math.ceil(a)
a を超えない最大の整数
Math.floor(a)
a より小さくない最小の整数
Math.rint(a)
整数に丸める
Math.atan2(a, b)
(a, b) の偏角
Math.pow(a, b)
ab
Math.random()
0以上1未満の乱数

次は,引数が float 型なら返す値は int 型,引数が double 型なら返す値は long 型です。

Math.round(a)
a を整数に丸めた値

次の三つは,引数が intlongfloatdouble のどれでもかまいません。返す値の型は引数の型と同じになります。

Math.abs(a)
絶対値
Math.max(a, b)
a と b の大きい方の値(a と b は同じ型)
Math.min(a, b)
a と b の小さい方の値(a と b は同じ型)

JDK 1.3 から Math 以外に StrictMath というクラスが新設されました。 StrictMath は,機種依存性をなくすため,Netlib の fdlibm (Freely Distributable Math Library) ライブラリのアルゴリズム(計算方法)で計算することになっています。 そのため,StrictMath はCPUによらずまったく同じ結果を与えますが,Math のほうがより高速でありえます。 もっとも,現状では Math の多くの関数が単に StrictMath のものを呼び出しているだけです。 三角関数などを多用する場合は,Java より C/C++ のほうが現状では有利です。

演算のルール

Java で計算に使う数値の型には,次のものがあります。

int
32ビット整数(-2147483648〜2147483647)
long
64ビット整数(-9223372036854775808〜9223372036854775807)
float
32ビット(単精度)実数,約6桁精度,範囲 ±3.40282×1038
double
64ビット(倍精度)実数,約15桁精度,範囲 ±1.79769……×10308

同じ 123 という数値でも,書き方によって,どの型として扱われるかが違います。

int 型どうしの計算は,答えも int 型の範囲で求められます。int 型の最大値は 2147483647 です。これ以上になると,マイナスの値に折り返されます。たとえば

    System.out.println(2147483647 + 1);

を実行すると -2147483648 と出力されてしまいます。

これを避けるには,どちらか(または両方)を long 型にします。

    System.out.println(2147483647L + 1);

これなら long 型として計算されるので,2147483648 になります。

float 型と double 型の混合演算の場合も,どちらかが double であれば結果は double になります。

乱数について

乱数とは,さいころを振って得られるようなでたらめな数のことです。

Javaで乱数を発生させるには,Math.random() という関数を使うのが一番わかりやすいでしょう。これは0以上1未満のでたらめな数を返してきます。実際にはこれを何倍かして,小数点以下を切り捨てて整数にして使うことが多いと思います。たとえば0から9までのでたらめな整数を作るには,

    (int)(10 * Math.random())

のように,10倍して整数化します。もっと具体的なプログラムの形にすれば,

class X {
    public static void main(String[] args) {
        for (int i = 0; i < 20; i++)
            System.out.println((int)(10 * Math.random()));
    }
}

を実行すると,0から9までのでたらめな整数が20個出力されます。

より正確な浮動小数点演算

クラスやメソッドの名前に strictfp という修飾語を付けると,その中の浮動小数点演算を厳密に IEEE 754 に従って行います。


奥村晴彦

Last modified: 2005-12-25 17:33:20