Java目線でコンパイラの仕組みをのぞいてみよう!

プログラマーの常識をJavaで身につける (3)

プログラムにおける数の扱い方の常識


NTTデータ ビジネスブレインズ
伊賀敏樹
2007/2/27


 数学関数を使いこなそう! [java.lang.Math]

 続いて、指数関数、対数関数、平方根、および三角関数といった基本的な数値処理を実行するためのメソッドを含んでいるjava.lang.Mathクラスを見ていきます。

java.lang.Math#max

 java.lang.Math#maxは、与えられた値のうち大きい方の値を返します。数学的な目的以外にも、処理の流れの中で2つの数値のうち大きい方の値を取得したい場合にも使われます。

java.lang.Math#min

 java.lang.Math#minは、与えられた値のうち小さい方の値を返します。処理の流れの中で2つの数値のうち小さい方の値を取得したい場合に使われます。

java.lang.Math#abs

 java.lang.Math#absは与えられた値の絶対値を返します。与えられた値が負の値である場合に、正と負を逆にした値(マイナスを取り除いた値)が返されます。

java.lang.Math#pow

 java.lang.Math#powは1番目のパラメータで与えた値を、2番目のパラメータで与えた値で累乗した結果の値を返します。なお、powメソッドはパラメータとしてdouble型を与えるようになっています。

 例えば、3の4乗を求めるには、下記PowSample.javaの(6)ように記載します。下記ソースコードを実行してみましょう。

PowSample.java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class PowSample extends JPanel {
    public PowSample() {
        setBackground(Color.white);
    }

    public void paintComponent(final Graphics argGraphics) {
        super.paintComponent(argGraphics);
        // 累乗を求めます。
        double a = 3;
        double b = 4;
        argGraphics.setFont(new Font("Dialog", Font.PLAIN, 36));
        argGraphics.drawString(Double.toString(a), 10, 36);
        argGraphics.setFont(new Font("Dialog", Font.PLAIN, 18));
        argGraphics.drawString(Double.toString(b), 72, 18);
        argGraphics.setFont(new Font("Dialog", Font.PLAIN, 36));
        argGraphics.drawString("= "
            + Double.toString(Math.pow(a, b)), 108, 36); //(6)
    }

     private static void createAndShowGUI() {
        final JFrame frame = new JFrame("累乗サンプル");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new PowSample());
        frame.setLocationRelativeTo(null);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }

     public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

図8 累乗サンプル
図8 累乗サンプル

 これ以外にも、数学的なメソッドが多数あります。数学が苦手でない人は、いろいろ試してみましょう。

 用途による型の使い分けを判断するには?

 ここまで、数に関するさまざまな型やクラスを説明してきました。では、これらプリミティブ型と参照型を、あるいはさまざまな数値型を、どのように使い分けるのでしょうか?

 最初に利用を検討する型は、プリミティブ型でしょう。四則演算から繰り返しの際のループ変数など、幅広い用途において利用されます。

 プリミティブ型のうちのいくつかは、多くのJava仮想マシンにおいて高速に計算できます。これは、Java仮想マシンの実装次第というところもあるのですが、プログラミング言語上の型が、実際のコンピュータ上のCPUが取り扱うことができる型に、直接対応付けられていることが多いためです。

 では、参照型は不要でしょうか?

 確かに、プリミティブ型と参照型の間の相互変換はプログラム上の記述が面倒なうえ、性能劣化の一因になることもあるので、なるべく避けておきたいところです。しかし、プログラムの中でいずれか一方に統一してしまいたいと思っても、現実的には、単純に統一できないことが多いです。むしろ、無理に統一しようとすると、思わぬ弊害を引き起こすことがあります。

 このように、「数値型をどのように使い分けるか?」は意外に難しい問題です。このため、対象とする目的によって型を使い分ける、という視点が必要になります。私たちプログラマーは、実現しようとする目的に応じて、数を扱うための型を、例えば、次のように変えていきます。

  • 業務系システム開発に従事する人は、デシマル型(java.math.BigDecimal)を頻繁に扱うことでしょう。
  • 科学技術計算に従事する人は、浮動小数点型を使う場合があるでしょう。一方で、高速な計算と計算精度との狭間で苦労する場面もあることでしょう。
  • 処理した結果をリレーショナルデータベースに対して入出力する場合には、リレーショナルデータベース上の型との対応関係を基に、プログラミング言語上の型を決定する必要があることでしょう。

 いずれにしても、最終的にはプログラミングを行うチームでの規約プログラマーとしての自身の経験などといったものから、総合的に型の適切な使い分けを判断していくしかないものと考えます。

 次回は「時間」の常識について

 次回は、時間日付けの常識についてです。java.util.Calendarクラス、java.util.GregorianCalendarクラス、java.util.Dateクラスなどを使って、プログラム上の時間の概念について学んでいきましょう。

参考文献

@IT関連記事

3/3

 Index
第3回 プログラムにおける数の扱い方の常識
  Page1
Javaにおける「数」
  プリミティブ型と参照型
  数に関するプリミティブ型
  プリミティブ型と参照型の対応 [java.lang.*の数値型に関するクラス]
  任意精度の整数型 [java.math.BigInteger]
  デシマル型 [java.math.BigDecimal]
プリミティブ型に対応付けられた数値の参照型を使う
  Page2
デシマルで加減乗除してみる [java.math.BigDecimal]
  java.math.BigDecimal#add(加算)
  java.math.BigDecimal#subtract(減算)
  java.math.BigDecimal#multiply(乗算)
  java.math.BigDecimal#divide(除算)
    スケールを指定しない例
    スケールを指定する例
  デシマル型の比較
    java.math.BigDecimal#compareToメソッド
    java.math.BigDecimal#equalsメソッド
  Page3
数学関数を使いこなそう! [java.lang.Math]
  java.lang.Math#max
  java.lang.Math#min
  java.lang.Math#abs
  java.lang.Math#pow
用途による型の使い分けを判断するには?
次回は「時間」の常識について


プロフィール
伊賀 敏樹(いが としき)
ハンドル:いがぴょん

1968年生まれ。現在、NTTデータ ビジネスブレインズ 第一SI事業部 ソリューショングループ所属。システム開発の技術支援などに従事する。仕事におけるJava言語とのかかわりは1998年から。 現在 blanco Frameworkというオープンソースによるソースコード自動生成タイプの開発フレームワーク提供に取り組んでいる。 趣味はヴァイオリン演奏。アマチュアオーケストラで演奏することもある。

ホームページ
いがぴょんの日記ウェブページv2(1996年から続けているWeb日記)

所属団体
blanco Framework(コミッタ)

主な著書
やさしく学ぶ基礎からのJDBC
Javaプログラミング[アプリケーション編]ステップアップラーニング





ご意見、ご感想はJava Solution 会議室へどうぞ


Java Solution全記事一覧



TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH