|
|
クラスライブラリの利用(Mathクラス) |
H.Kamifuji . |
指数関数、対数関数、平方根、および三角関数といった基本的な数値処理を実行するためのMathクラスについて見ていきます。 クラス定義は下記のようになっています。 java.lang.Object | +-- java.lang.Math public final class Math extends ObjectMathクラスはjava.langパッケージに含まれますのでimport文は必要ありません。またMathクラスのメソッドは全てstaticメソッドとなっているため、Mathクラスのオブジェクトを作成しなくても「Math.abs(10.0d)」のように使う事ができます。詳細は個々のメソッドを見てください。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
引数に指定した値の絶対値を求めます。引数に指定できる数値は、double型、float型、int型、long型のどれかで、それぞれ同じ名前のメソッドが用意されています。 double型: abs public static double abs(double a)double 値の絶対値を返します。引数が負でない場合は引数そのものを返します。負のときは、その正負を逆にした値を返します。特例として、 引数が正のゼロまたは負のゼロの場合は、正のゼロを返す 引数が無限大の場合は、正の無限大値を返す 引数が NaN の場合は、NaN を返す パラメータ: a - 属性値を決める引数 戻り値: 引数の絶対値 float型: abs public static float abs(float a)float 値の絶対値を返します。引数が負でない場合は引数そのものを返します。負のときは、その正負を逆にした値を返します。特例として、 引数が正のゼロまたは負のゼロの場合は、正のゼロを返す 引数が無限大の場合は、正の無限大値を返す 引数が NaN の場合は、NaN を返す パラメータ: a - 属性値を決める引数 戻り値: 引数の絶対値 int型: abs public static int abs(int a)int 値の絶対値を返します。引数が負でない場合は引数そのものが返されます。引数が負の場合は、その正負を逆にした値が返されます。 パラメータ: a - 属性値を決める引数 戻り値: 引数の絶対値 long型: abs public static long abs(long a)long 値の絶対値を返します。引数が負でない場合は引数そのものが返されます。引数が負の場合は、その正負を逆にした値が返されます。 パラメータ: a - 属性値を決める引数 戻り値: 引数の絶対値 int型の値の絶対値を求めるた場合はint型の値が、float型の絶対値を求めた場合はfloat型の値が帰ってくることになります。それぞれstaticメソッドですので、下記のように使います。 int num = -10; int abs_num = Math.abs(num);では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testMath1{ public static void main(String args[]){ for (int i = -5 ; i < 5 ; i++){ System.out.println(i + "の絶対値は" + Math.abs(i) + "です"); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Math]$ javac testMath1.java [xxxxxxxx@dddddddddd Math]$ java testMath1 -5の絶対値は5です -4の絶対値は4です -3の絶対値は3です -2の絶対値は2です -1の絶対値は1です 0の絶対値は0です 1の絶対値は1です 2の絶対値は2です 3の絶対値は3です 4の絶対値は4です [xxxxxxxx@dddddddddd Math]$ |
引数に指定した2つの値のうち、どちらか大きい方の値を取得します。引数に指定できる数値は、double型、float型、int型、long型のどれかで、それぞれ同じ名前のメソッドが用意されています。 double型: max public static double max(double a, double b)2 つの double 値のうち大きいほうを返します。つまり、結果は正の無限大に近いほうの引数となります。引数の値が同じ場合は同じ値を返します。どちらかの値が NaN の場合は NaN を返します。数値比較演算子とは異なり、このメソッドは負のゼロが厳密には正のゼロよりも小さいと見なします。一方の引数が正のゼロでもう一方が負のゼロの場合は、正のゼロを返します。 パラメータ: a - 引数 b - 別の引数 戻り値: a と b のどちらか大きいほう float型: max public static float max(float a, float b)2 つの float 値のうち大きいほうを返します。つまり、結果は正の無限大に近いほうの引数となります。引数の値が同じ場合は同じ値を返します。どちらかの値が NaN の場合は NaN を返します。数値比較演算子とは異なり、このメソッドは負のゼロが厳密には正のゼロよりも小さいと見なします。一方の引数が正のゼロでもう一方が負のゼロの場合は、正のゼロを返します。 パラメータ: a - 引数 b - 別の引数 戻り値: a と b のどちらか大きいほう int型: max public static int max(int a, int b)2 つの int 値のうち大きいほうを返します。引数の値が同じ場合は同じ値を返します。 パラメータ: a - 引数 b - 別の引数 戻り値: a と b のどちらか大きいほう long型: max public static long max(long a, long b)2 つの long 値のうち大きいほうを返します。引数の値が同じ場合は同じ値を返します。 パラメータ: a - 引数 b - 別の引数 戻り値: a と b のどちらか大きいほう 比較する2つの値は同じ型である必要があります。使い方は下記の通りです。 int a = 10; int b = 20; int max_num = Math.max(a, b);「max」メソッドは、if文を使って下記のように記述した場合とほぼ同じです。単にどちらか大きい値を取得したい場合には、if文よりも便利かと思います。 int a = 10; int b = 20; int max_num; if (a >= b){ max_num = a; }else{ max_num = b; }では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testMath2{ public static void main(String args[]){ int a = 10; int b = 4; System.out.println("「" + a + "」と「" + b + "」では"); System.out.println("「" + Math.max(a, b) + "」の方が大きい。"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Math]$ javac testMath2.java [xxxxxxxx@dddddddddd Math]$ java testMath2 「10」と「4」では 「10」の方が大きい。 [xxxxxxxx@dddddddddd Math]$ |
引数に指定した2つの値のうち、どちらか小さい方の値を取得します。引数に指定できる数値は、double型、float型、int型、long型のどれかで、それぞれ同じ名前のメソッドが用意されています。 double型: min public static double min(double a, double b)2 つの double 値のうち小さいほうを返します。つまり、結果は負の無限大に近いほうの値となります。引数の値が同じ場合は同じ値を返します。どちらかの値が NaN の場合は NaN を返します。数値比較演算子とは異なり、このメソッドは負のゼロが厳密には正のゼロよりも小さいと見なします。一方の引数が正のゼロでもう一方が負のゼロの場合は、負のゼロを返します。 パラメータ: a - 引数 b - 別の引数 戻り値: a と b のどちらか小さいほう float型: min public static float min(float a, float b)2 つの float 値のうち小さいほうを返します。つまり、結果は負の無限大に近いほうの値となります。引数の値が同じ場合は同じ値を返します。どちらかの値が NaN の場合は NaN を返します。数値比較演算子とは異なり、このメソッドは負のゼロが厳密には正のゼロよりも小さいと見なします。一方の引数が正のゼロでもう一方が負のゼロの場合は、負のゼロを返します。 パラメータ: a - 引数 b - 別の引数 戻り値: a と b のどちらか小さいほう int型: min public static int min(int a, int b)2 つの int 値のうち小さいほうを返します。引数の値が同じ場合は同じ値を返します。 パラメータ: a - 引数 b - 別の引数 戻り値: a と b のどちらか小さいほう long型: min public static long min(long a, long b)2 つの long 値のうち小さいほうを返します。引数の値が同じ場合は同じ値を返します。 パラメータ: a - 引数 b - 別の引数 戻り値: a と b のどちらか小さいほう 比較する2つの値は同じ型である必要があります。使い方は下記の通りです。 int a = 10; int b = 20; int min_num = Math.min(a, b);「min」メソッドは、if文を使って下記のように記述した場合とほぼ同じです。単にどちらか小さいを取得したい場合には、if文よりも便利かと思います。 int a = 10; int b = 20; int min_num; if (a <= b){ min_num = a; }else{ min_num = b; }では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testMath3{ public static void main(String args[]){ int a = 10; int b = 4; System.out.println("「" + a + "」と「" + b + "」では"); System.out.println("「" + Math.min(a, b) + "」の方が小さい。"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Math]$ javac testMath3.java [xxxxxxxx@dddddddddd Math]$ java testMath3 「10」と「4」では 「4」の方が小さい。 [xxxxxxxx@dddddddddd Math]$ |
ある値を別の値分だけ累乗した値を求める方法です。 pow public static double pow(double a, double b)1 番目の引数を、2 番目の引数で累乗した値を返します。 パラメータ: a - 基数 b - 指数 戻り値: aをbだけ累乗した値 累乗というのは例えば「Math.pow(4, 5);」と言うのは「4×4×4×4×4」と同じです。使い方としては下記の通りです。 double a = 3d; double b = 7d; double num = Math.pow(a, b);では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testMath4{ public static void main(String args[]){ double a = 9d; double b = 4d; System.out.println("「" + a + "」の「" + b + "」乗は"); System.out.println("「" + Math.pow(a, b) + "」です。"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Math]$ javac testMath4.java [xxxxxxxx@dddddddddd Math]$ java testMath4 「9.0」の「4.0」乗は 「6561.0」です。 [xxxxxxxx@dddddddddd Math]$ |
ある値の平方根及び立方根を求める方法です。平方根を求めるには「sqrt」メソッドを使います。 sqrt public static double sqrt(double a)double 値の正しく丸めた正の平方根を返します。 パラメータ: a - 値 戻り値: a の正の平方根 立方根を求めるには「cbrt」メソッドを使います。 cbrt public static double cbrt(double a)double 値の立方根を返します。正の有限値 x の場合、cbrt(-x) == -cbrt(x)。つまり、負の値の立方根は、値の絶対値の立方根を負にしたものです。 パラメータ: a - 値 戻り値: a の立方根 ある値の平方根と言うのは2乗したらある値になるような値のことです。立方根というのは3乗したらある値になる値です。使い方としては下記の通りです。 double a = 16d; double b = 27d; double sqrt_num = Math.sqrt(a); double cbrt_num = Math.cbrt(b);では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testMath5{ public static void main(String args[]){ double a = 9d; double b = 200d; double c = 2d; System.out.println("「" + a + "」の平方根は"); System.out.println("「" + Math.sqrt(a) + "」です。"); System.out.println("「" + c + "」の平方根は"); System.out.println("「" + Math.sqrt(c) + "」です。"); System.out.println("「" + b + "」の立方根は"); System.out.println("「" + Math.cbrt(b) + "」です。"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Math]$ javac testMath5.java [xxxxxxxx@dddddddddd Math]$ java testMath5 「9.0」の平方根は 「3.0」です。 「2.0」の平方根は 「1.4142135623730951」です。 「200.0」の立方根は 「5.848035476425732」です。 [xxxxxxxx@dddddddddd Math]$ |
指定した値の対数を求めます。「log」メソッドは底がeのもの、「log10」メソッドは底が10のもの、「log1p」メソッドは底がeで真数が(1+指定した値)のものとなります。 log public static double log(double a)指定された double 値の自然対数値 (底は e) を返します。 パラメータ: a - 値 戻り値: ln a の値。a の自然対数 自然対数値とは下記のような値です。下記の2つは同じ式の書き方を変えたもので、「log」メソッドでは下記の「x」の値を求める事ができます。 ![]() log10 public static double log10(double a)double 値の 10 を底とする対数を返します。 パラメータ: a - 値 戻り値: a の 10 を底とする対数 10を底とする数値とは下記のような値です。「log10」メソッドでは下記の「x」の値を求める事ができます。 ![]() log1p public static double log1p(double x)引数と 1 の合計の自然対数を返します。x の値が小さい場合、log1p(x) の結果は、log(1.0+x) の浮動小数点評価よりも ln(1 + x) の真の結果にかなり近くなります。 パラメータ: x - 値 戻り値: ln(x + 1) の値。x + 1 の自然対数 「log1p」メソッドでは下記の「x」の値を求める事ができます。 ![]() また、今回は使いませんがMathクラスでは自然対数の底 e にもっとも近い double 値の値として「Math.E」という定数が定義されています。「e」の値を今後使う場合には、この定数を利用して下さい。 public static final double E = 2.718281828459045では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testMath6{ public static void main(String args[]){ double a = 42d; double b = 100d; double c = 0.08d; System.out.println("「" + a + "」の自然対数は"); System.out.println("「" + Math.log(a) + "」です。"); System.out.println("「" + b + "」を根とする対数は"); System.out.println("「" + Math.log10(b) + "」です。"); System.out.println("「" + c + "+1」を真数とする自然対数は"); System.out.println("「" + Math.log1p(c) + "」です。"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Math]$ javac testMath6.java [xxxxxxxx@dddddddddd Math]$ java testMath6 「42.0」の自然対数は 「3.7376696182833684」です。 「100.0」を根とする対数は 「2.0」です。 「0.08+1」を真数とする自然対数は 「0.07696104113612832」です。 [xxxxxxxx@dddddddddd Math]$ |
値を切り上げたり四捨五入したりした結果の値を求める方法です。「ceil」メソッドは切り上げ、「floor」メソッドは切捨て、「round」メソッドは四捨五入した結果を返します。「round」メソッドには引数にdouble型の値を取るものとfloat型の値を取るものの2つが用意されています。 ceil public static double ceil(double a)引数の値以上で、計算上の整数と等しい、最小の (負の無限大にもっとも近い) double 値を返します。 パラメータ: a - 値 戻り値: 引数の値以上で、計算上の整数と等しい、最小の (負の無限大にもっとも近い)浮動小数点値 floor: floor public static double floor(double a)引数の値以下で、計算上の整数と等しい、最大の (正の無限大にもっとも近い) double 値を返します。 パラメータ: a - 値 戻り値: 引数の値以下で、計算上の整数と等しい、最大の (正の無限大にもっとも近い) 浮動小数点値 round(double): round public static long round(double a)引数にもっとも近い long を返します。結果は 1/2 を加えて floor メソッドで取り int にキャストして整数に丸められます。すなわち、結果は次の式の値になります。 (long)Math.floor(a + 0.5d) パラメータ: a - long に丸める浮動小数点値 戻り値: 引数をもっとも近い long 値に丸めた値 round(float): round public static int round(float a)引数にもっとも近い int を返します。結果は 1/2 を加えて floor メソッドで取り int にキャストして整数に丸められます。すなわち、結果は次の式の値になります。 (int)Math.floor(a + 0.5f) パラメータ: a - 整数に丸める浮動小数点値 戻り値: 引数をもっとも近い int 値に丸めた値 ※「round」メソッドでは、引数の型と戻り値の型が異なりますので注意して下さい。 それぞれのメソッドを使った結果は下記のような感じとなります。 値 切り上げ 切り捨て 四捨五入 --------------------------------------- 1.34 2.0 1.0 1 3.67 4.0 3.0 4 -0.23 -0.0 -1.0 0 -3.89 -3.0 -4.0 -4マイナスの時の値に注意して下さい。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testMath7{ public static void main(String args[]){ double a = 1.34d; double b = 3.67d; double c = -0.23d; double d = -3.89d; System.out.println("「" + a + "」に対して"); System.out.println("切り上げ「" + Math.ceil(a) + "」"); System.out.println("切り捨て「" + Math.floor(a) + "」"); System.out.println("四捨五入「" + Math.round(a) + "」"); System.out.println("「" + b + "」に対して"); System.out.println("切り上げ「" + Math.ceil(b) + "」"); System.out.println("切り捨て「" + Math.floor(b) + "」"); System.out.println("四捨五入「" + Math.round(b) + "」"); System.out.println("「" + c + "」に対して"); System.out.println("切り上げ「" + Math.ceil(c) + "」"); System.out.println("切り捨て「" + Math.floor(c) + "」"); System.out.println("四捨五入「" + Math.round(c) + "」"); System.out.println("「" + d + "」に対して"); System.out.println("切り上げ「" + Math.ceil(d) + "」"); System.out.println("切り捨て「" + Math.floor(d) + "」"); System.out.println("四捨五入「" + Math.round(d) + "」"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Math]$ javac testMath7.java [xxxxxxxx@dddddddddd Math]$ java testMath7 「1.34」に対して 切り上げ「2.0」 切り捨て「1.0」 四捨五入「1」 「3.67」に対して 切り上げ「4.0」 切り捨て「3.0」 四捨五入「4」 「-0.23」に対して 切り上げ「-0.0」 切り捨て「-1.0」 四捨五入「0」 「-3.89」に対して 切り上げ「-3.0」 切り捨て「-4.0」 四捨五入「-4」 [xxxxxxxx@dddddddddd Math]$ |
|