質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2199閲覧

double型の範囲について

chankane

総合スコア139

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/04/29 10:52

###前提・実現したいこと
毎度お世話になっております。グラフで曲線を描きたいと思っております。
結果を格納する変数にdouble型を用いているのですが、途中から値がおかしくなります。
num:5451 answer:86684401E7
num:5452 answer:-8.4838767E7
といった具合に急に符号がひっくり返ります(´・ω・`)……

###該当のソースコード

java

1void calc(int num){ 2 double ans = (num+1)*(num+3)*(2*num+1)/24; 3 System.out.println(ans + "\n"); 4}

###試したこと
ansにdouble型の範囲を超えた値が入ったと思い調べてみたが、関係がないような気がする。間違っていたらすみません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

void calc(int num){

int なので、ここをdoubleに変えれば問題は解決します。

ここでおかしな値が出て来る原因は

(num+1)(num+3)(2*num+1)/24

が int として計算されているためです。そのintをdoubleにcastしたものがansです。その為2^31以上の数が扱えていません。intのオーバーフローが起きてしまっています。

java

1 public static void main(String[] args) { 2 for (int i = 1000; i > 0; i++ ) { 3 if (calc_int(i) < 0) { 4 System.out.println("i = " + i); 5 System.out.println(calc(i)); 6 System.out.println(calc_int(i)); 7 break; 8 } 9 } 10 } 11 static double calc(double num){ 12 return (num+1)*(num+3)*(2*num+1)/24; 13 } 14 static double calc_int(int num){ 15 return (num+1)*(num+3)*(2*num+1)/24; 16 }

投稿2017/04/29 11:35

TakeoAsai

総合スコア880

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chankane

2017/04/29 11:59

うまくいかない原因がよくわかりました。右辺がintなので意味がなかったですね 普段int型を超えるような大きな数はあまり扱かってこなかったのですが、注意していきたいです。 ベストアンサーはご回答が早かったmaiko031さまにさせていただきました。 ありがとうございました。
guest

0

ベストアンサー

doubleの計算はdoubleで行いましょう。
double ans = (num+1d)(num+3d)(2d*num+1d)/24d;

これでうまくいきます。
1.3508457201E10
1.3515891003125E10

すべてintでやってしまったための桁落ちでした。

投稿2017/04/29 11:26

編集2017/04/29 11:27
maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chankane

2017/04/29 11:32

具体的には3回掛け算のするところでint型として扱われていたため桁落ちしたのでしょうか? とても初歩的なミスでした。今後もこのようなクセをつけたいです。 ありがとうございました
maiko0318

2017/04/29 11:48

void calc(int num){ をdoubleにしたのなら渡す方もdoubleにしてください。 int i = 1000; calc(i) static double calc(double num){ これはダメです。うまく動いているかもしれませんが型は合わせましょう。
chankane

2017/04/29 12:01

そうですか(@_@) 引数の型はあわせないといけないのですね 勉強になりました。
swordone

2017/04/30 01:35

引数型をdoubleにしたならintを渡すときに自動でキャストされるはずですが…
maiko0318

2017/04/30 01:45

そういう言語もあります。 そうでない言語もあります。 処理系に依存する部分もあります。 きちんと合わせておけばどんな言語でも通用するからいいと思いますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問