javaのdoubleでの計算による誤差

このQ&Aのポイント
  • javaのdoubleを使った計算で、正確な値が得られないことがあります。特に小数点の計算で誤差が生じることがあります。
  • この問題は、コンピュータが浮動小数点数を2進数で表現するために起こります。2進数表現では、一部の小数を正確に表すことができません。
  • そのため、double型の変数を使った足し算や割り算の結果には微小な誤差が生じることがあります。これは計算の順序や丸め誤差などの要素も関与しています。
回答を見る
  • ベストアンサー

javaのdoubleでの計算による誤差

宜しくお願いします。 割り算でなくても、足し算の小数点計算で誤差がでます。 public class keisan { public static void main(String[] args) { double a1 = 12.3; double b1 = 45.6; System.out.println(a1 + b1); } } 結果が 57.900000000000006 となります。 きっちり57.9とならないのはなぜでしょう? 他の数字でも数が小数点以下でブレます。 原因に何が考えられるでしょうか? OSはWindowsXP pro ver.2002 SP3 32bit jdk 1.6.0_17 eclipseは Eclipse Platform Version: 3.5.2.R35x_v20100210-0800-9hEiFzmFst-TiEn9hNYgDWg1XN8ulH_JvCNGB Build id: M20100211-1343 を使っています。

  • Java
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
noname#147388
noname#147388
回答No.2

丸め誤差

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

この数値でどうして「デノーマル数の事と推察」したのでしょうか>#3. ちなみに今の問題は数値計算では当然念頭に置かなければならないことです.

  • yhc3594
  • ベストアンサー率27% (25/92)
回答No.3

デノーマル数の事と推察致します。 *コンピューターの内部は2進数(0と1)で表現するので、限界がある。 詳しい事は以下を参照して下さい。 http://www.g200kg.com/archives/2011/10/javascript-1.html

bajiriko
質問者

お礼

2進数と10進数の誤差ですね。 ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

double の値が内部でどのように保持されているかを調べてみてください.

bajiriko
質問者

お礼

調べます。ありがとうございました。

関連するQ&A

  • C++ インラインアセンブラでdoubleの計算

    プログラム初心者です。 インラインアセンブラで浮動小数点を計算したいのですが、 計算出来ません。fmov、faddで浮動小数点演算が可能との事ですが。 整数の演算と同様では計算できないのでしょうか? 下記の様にまず、aとbを足し算をしてみました。 double a=2.1; double b=1.1; __asm{ fmov st1,a fmov st2,b fadd st1,st2 fmov a,st1 } cout << a << endl;

  • Javaの計算結果がおかしい

    javaの勉強をしていますが、以下のプログラム(double型の配列データを全件合計)を実行するとおかしな結果になります。 どなたか、理由をご教示願いただきたく。 package exec; public class Error { public static void main(String[] args) { double[] data = {12.3,12.2,12.3,13.0,12.8,13.0}; double total = 0.0; for (double dd : data){ total += dd; System.out.println(total); } } } 実行結果は、次のように正しくありません。 12.3 24.5 37.5 50.3 62.599999999999994 75.6 ちなみに、double[] data = {12.3,12.2,13.0,12.8,13.0,12.3}; のように2つめの12.3を最後にすると 12.3 24.5 37.5 50.3 63.3 75.6 と正しい集計をします。 環境はWindows7(64bit)、Eclipse 3.7(junoでも同じ結果)、JDK1.7 です。 以上、よろしくお願いいたします。

  • doubleについて

    すみません、下記のコードで double ans5 = (7+32)/(double)5; System.out.println("(7+32)/5は" + ans5 + "です。"); 右辺のdoubleが何故つくのかわかりません。5はintでいいと思うのですが、出る答えdoubleなので左辺をdoubleで指定しますよね?ならば、出てくる答えも自然doubleになるのではないのでしょうか? よく割り算の場合、左辺はdoubleで右辺の割る部分もdoubleで指定してありますすが、そういう決まりなんですか? 一度、消して実行したところ、やはり、小数点以下は切り捨てられていました。そういうものだと、このコードは分かっても他に応用が利かないので、詳しい方、教えてください。 かなり初心者ですがよろしくお願いします。」

  • ダブルクォートがエスケープできない

    public static final String HOGE = "¥"hogehoge¥""; public static void main(String[] args){ System.out.println(HOGE); } eclipseで上記のようなコードがエラー表示されます。しかし実行はできます。 実行結果:"hogehoge" エラー表示を取る事は出来ますか? よろしくお願いします 環境 mac osx eclipse 4.2 java 1.6

    • ベストアンサー
    • Java
  • 足し算するプログラム

    タイトルの通りですが足し算をするプログラムを書いてみました。 第一引数を第二引数を足し算するのですが引数に「001」や「002」などの数字が入力された時に足し算した結果として素直に「00*」と足し算が出来ません。何かいい方法は無いでしょうか?教えてください。 import java.text.*; class Tashizan { public static void main(String[] args) { try { if(args.length == 0) { System.out.println("引数を整数値で入力して下さい。"); } else if(args.length == 1) { System.out.println("引数を整数値で2つ入力して下さい。"); } else if(args.length == 2) { int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); if(a <= 999999999 && b <= 999999999) { int wa = a + b; System.out.println(a + "+" + b + "の和は" + wa + "です。"); } else { System.out.println("入力した桁数を9桁以下か確認してください。"); } } else { System.out.println("引数は整数値で2つ入力して下さい。"); } } catch(NumberFormatException nfe) { System.out.println("整数値を2つ入力して下さい。"); } catch(Exception e) { System.out.println(e + "エラー発生!処理を終了します。"); } } }

    • ベストアンサー
    • Java
  • へロンの公式 java

    たびたびどうもですw 以下のプログラミングをjavaで書くには、どうすればよいでしょうか? 三角形ABCの3辺の長さa, b, cを読み込んで、へロンの公式 s = √p(p-a)(p-b)(p-c) ここに、p = (a+b+c)/2によって面積sを計算して出力するプログラムを作りなさい。ただし、3辺の長さを一度に読み込み、そのうちいずれかがゼロ以下であるか、またはa<b+c, b<c+a, c<a+bのいずれかが満たされていない場合には、警告を表示して実行を停止するものとする。なお、(1)書式無し、(2)小数点以下5桁、全幅10桁の固定小数点、(3)仮数部小数点以下5桁、全幅14桁の浮動小数点の3通りの書式で続けて出力させるものとする。 実行例; 三角形の3辺の長さを入力しなさい;2.5 2 1.5 三角形の面積は1.5です 三角形の面積は 1.50000です 三角形の面積は 1.50000e+00です ちなみに自分でここまでやってみました。どこが違うのでしょうか? import java.util.Scanner; class Mondai { public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("三角形の3辺の長さを入力>"); double a = stdIn.nextInt(); double b = stdIn.nextInt(); double c = stdIn.nextInt(); double p = (a + b + c)/2; s = Math.sqrt(p * (p - a) * (p - b) * (p - c)); double s = stdIn.nextInt(); if (0 > a) System.out.println("警告します.実行を停止してください."); else if (0 > b) System.out.println("警告します.実行を停止してください."); else if (0 > c) System.out.println("警告します.実行を停止してください."); else if ((b + c > a) && (c + a > b) && (a + b > c)) System.out.printf("三角形の面積は%3dです. \n", s); System.out.printf("三角形の面積は%10fです. \n", s); else System.out.println("警告します.実行を停止してください."); } }

  • コマンドライン引数の掛け算のプログラムを教えて下さい。

    コマンドライン引数で*で掛け算するプログラムを作成しています。 「"*"」の入力なしに c:\myweb\keisanmain>java myweb.Keisanmain.Keisan 1 * 2 を実行してくれる掛け算のプログラムを自分なりにここまで作成しました。 実行の結果 c:\myweb\keisanmain>java myweb.Keisanmain.Keisan 1 * 2 Exception in thread "main" java.lang.NoClassDefFoundError: myweb/Keisanmain/Keisan というバグがでます。 どうかわかる方お時間があるときに教えて下さい。 package myweb.keisanmain; class Mainkeisan{ public static void main (String args[]){ if(args.length == 0){ }else if(args.length == 1){ }else if(args.length == 2){ }else if(args.length == 3){ /** *c:\myweb\keisanmain>java myweb.Keisanmain.Keisan 1 * 2 Exception in thread "main" java.lang.NoClassDefFoundError: myweb/Keisanmain/Keis an */ double num =0.0; Integer a = new Integer("args[0] * args[1]"); double b = a.doubleValue(); System.out.println(b); } } }

    • ベストアンサー
    • Java
  • Javaの計算について

    Java初心者です。以下の問題で、c = 10になるのか判りません。括弧が先に計算されるのではないのでしょうか?どなたか解説していただけませんでしょうか? public class M{ public static void main(String[] args){ int a = 5; int b = (a = 2) * a; a = 5; int c = a * (a = 2); System.out.println("b = " + b + " c = " + c); } }

    • ベストアンサー
    • Java
  • 計算クラスのメソッドについて

    <問題> Mainクラス mainメソッド 1)実行時に引数を2つ付けて実行する。(数字) 2)計算クラスのオブジェクトを生成。 3)argsの0番目と1番目から値を取得し、int型に変換する。 4)int型に変換した値2つを引数として、計算クラスの足し算メソ   ッドを実行し、戻り値を取得して表示する。 計算クラス 足し算メソッド(引数=int,int) 1)int型の数字を引数として2つ受け取る。 2)二つの引数の値を足し算する。 3)計算した値を戻り値とする。 *********************************************************** 上記の問題についての質問です。 最初mathくらすのメソッドを使うのかと思ったのですが、 足し算を計算するようなメソッドが無かったのでネットで検索 して見つけたcalcAdd()というメソッドを使って記述してみました。 でも「シンボルを見つけられません」のエラーが出てコンパイル 出来ないし、メソッドの使い方も違うような気がするので、 分かる方正しい記述の仕方を教えてください。 package siryou; class Keisan { int cal; int cul; public int tashizan(int a, int u) { cal = a; cul = u; int kekka = (Integer)calcAdd(cal, cul, 0); return kekka; } } class TashiHikiKakeWari { public static void main(String args[]) { Keisan ki = new Keisan(); String str1 = args[0]; String str2 = args[1]; int res1 = Integer.parseInt(str1); int res2 = Integer.parseInt(str2); ki.tashizan(res1, res2); int kekka = ki.tashizan(res1, res2); System.out.println(kekka); } } ************************************************************ calcAdd()メソッドの呼び出し方も間違っている気がするのですが、 そもそもこのメソッドって呼び出せば自動的に計算されるように なっているのですか? それとも足し算を計算する記述は別にしなければならないのでしょうか?

    • ベストアンサー
    • Java
  • JAVA キャスト

    public class Test1{ public static void main(String[] args){ byte b1 =3; byte b2 =5; byte b3 =b1*b2; System.out.println("b3="+b3); } } キャストしてコンパイル出来る形にするにはどうしたらいいでしょうか?

    • ベストアンサー
    • Java