SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

突然ですがクイズです!(AD)

突然ですがクイズです!-その2

Delphi、C++、Java、C#、PHP、Rubyの6言語の動作の違いをクイズで考察

  • X ポスト
  • このエントリーをはてなブックマークに追加

ゼロを比較

問題

 さて、浮動小数点について。同じに見える2つのゼロ(+0.0、-0.0)を比較するコードを6つの言語で試してみました。今回もやはり1つだけ出力結果が違うものがありました。それはどれでしょうか?

Delphi
program Project1;
{$APPTYPE CONSOLE}
var
  a: Extended;
begin
  a := 0.0;
  if a = -0.0 then
    Write('equal');
end.
C++
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
  double a = 0.0;
  if( a == -0.0 )
    cout << "equal";
  return 0;
}
Java SE 5
package project1;
public class Project1 {
  public static void main(String[] args) {
    Double a = 0.0;
    if( a.equals(-0.0) )
      System.out.print("equal");
  }
}
C#
namespace project1 {
public class Project1 {
  public static void Main() {
    double a = 0.0;
    if( a == -0.0 )
      System.Console.Write("equal");
  }
}
}
PHP5
<?php
$a = 0.0;
if( $a == -0.0 )
  echo 'equal';
?>
Ruby
a = 0.0
if a == -0.0
  print "equal"
end
解説

 正解は「Java」。

 Javaでは、期待した「equal」は出力されません。それ以外の言語では正しく「equal」が出力され、2つのゼロ(+0.0、-0.0)が等しいことが確認できます。一般的に、この2つのゼロ(+0.0、-0.0)は等しいと扱うのが自然だと思いますが、Javaはマイナスのゼロ「-0.0」に対応しています。

 問題のコードがプリミティブ型の「double」ではなく、ラッパータイプの「java.lang.Doubleクラス」を利用している点に注目してください。java.lang.Doubleクラスのコンストラクタは、doubleの即値「-0.0」や文字列「”-0.0”」を特別な値として受け取ることができ、2つのゼロ(+0.0、-0.0)を区別することが可能です。

 問題のコードはJava SE 5から導入されたボクシング変換を併用しているので、以下に示すようにJava SE 5以前のコードに置き換えて考えると分かりやすいでしょう。

Double a = new Double(+0.0);
if( a.equals(new Double(-0.0)) )
  System.out.print("equal");

 もちろん、DoubleクラスのdoubleValue()メソッドを使って「equal」と出力することもできます。

Double a = new Double(+0.0);
Double b = new Double(-0.0);
if( a.doubleValue() == b.doubleValue() )
  System.out.print("equal");

次のページ
ビット演算と…

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
突然ですがクイズです!連載記事一覧
この記事の著者

EDN編集部(イーディーエヌ編集部)

エンバカデロ・デベロッパーネットワーク(EDN)は、ソフトウェア開発者とデータベース技術者のための技術情報サイトです。Delphi、C++Builderをはじめとする開発ツールやER/Studioなどのデータベースツールに関連する技術記事、ビデオなどを提供しています。EDN編集部は、EDN記事と連携...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2297 2008/08/20 13:35

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング