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

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

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

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

Q&A

解決済

7回答

9493閲覧

mathクラスを使わない方法

qwerty123

総合スコア26

Java

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

0グッド

0クリップ

投稿2015/05/14 23:21

編集2015/05/18 14:36

java初心者です。
javaでは、mathクラスを使って以下のようなプログラムで平方根を求めることができることを学びました。

public class Square {
public static void main(String[] args) {
double k;
int a = 2;
k=Math.sqrt(a);
System.out.println(k);
}
}

そこで疑問に思ったのですが、mathクラスを使わずにjavaで平方根を求めることは可能でしょうか。

よろしくお願いします。

追記:
public class Square {
public static void main(String[] args) {

double square = 1; //最終的に2の平方根になる変数 double num = 1; //二乗の値の変数 while(true) { square = num * num; if(square > 2) { num -= 0.0001; }else{ num += 0.0001; } if( /*条件*/ ) { break; } } //少数第3位までを求める double thousand = square * 1000; double cast = (int)thousand; double answer = cast / 1000; System.out.println(answer); }

}

2の平方根を小数第三位まで求めるプログラムを作成しようと思いましたが、条件の定義がどうしてもよくわかりません。

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

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

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

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

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

guest

回答7

0

mathクラスを使わずにjavaで平方根を求めることは可能でしょうか。

もちろん可能です。
平方根を求めるアルゴリズムはいくつかあるので、IchigoTarutoさんが回答されたやり方以外にもあります。
アルゴリズムはニュートン法や2分法といったものが有名です。

openJDKのMath.sqrtは以下のCのライブラリを参照しているようです。
http://www.netlib.org/fdlibm/w_sqrt.c
http://www.netlib.org/fdlibm/e_sqrt.c

投稿2015/05/15 00:51

sho_cs

総合スコア3541

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

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

0

java.lang.Mathを使わないで平方根を計算する一番簡単な方法はjava.lang.StrictMathを使うことでしょうか :-P

StrictMath

平方根算出に関しては精度や速度を考えるとなかなか難しい話題ですね。

投稿2015/05/19 08:02

nagise

総合スコア87

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

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

0

編集したコードを見ました.
このコードの大きな問題点として,計算回数が多くなりすぎるという点があります.

ルート2の値は1.4142・・・ですから,この手法だと4000回以上加算及び乗算をしないといけないことになります.
2だからまだいいですが,これがもっと大きくなると計算回数が途方も無いことになりかねません.
あえて終了条件を挙げるなら,それまで乗算の結果が2未満だったのが2を超えた時,その直前の値を結果とする,という形にするのがこの場合妥当でしょう.
あとsquareとnumの扱いが逆です.

あとは,他の方の回答をちゃんと見てください.平方根を求めるアルゴリズムというのはちゃんとあります.
二分法,ニュートン法とありますが,どちらもy=x^2-aのグラフのx軸との交点の座標を漸近的に求める手法です.

投稿2015/05/18 15:36

編集2015/05/18 16:49
swordone

総合スコア20651

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

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

0

参考情報:

投稿2015/05/15 15:20

katoy

総合スコア22324

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

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

0

ベストアンサー

ニュートン法で書いてみました

lang

1 public static double sqrt(double a){ 2 if (Double.isNaN(a) || a < 0.0) { 3 return Double.NaN; 4 } 5 if (a == 0.0) { 6 return 0.0; 7 } 8 double x = a > 1.0 ? a : 1.0; 9 double d = a; 10 while(d > 0.0){ 11 double x1 = (x + a / x) / 2; 12 d = x - x1; 13 x = x1; 14 } 15 return x; 16 }

投稿2015/05/15 13:24

編集2015/05/15 13:29
swordone

総合スコア20651

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

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

0

みなさんが言っているように、可能です。
Mathクラスも、javaで書かれていますし。

Javaはオープンソースなので、
もし処理内容に興味があるのなら、見たいバージョンのJDKのソースをダウンロードして見てみるのも勉強になるかと思います^^

投稿2015/05/15 02:27

kaputaros

総合スコア1844

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

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

kaputaros

2015/05/15 02:43

すみません。 srcダウンロードして確認してみたら、nativeメソッドでした。。。
guest

0

Math.sqrtと全く同じ動きではないですが、簡単に組んでみました。

lang

1 private static double sqrt(double v) { 2 if(Double.isNaN(v) || v < 0.0) { 3 return Double.NaN; 4 } 5 if(v == 0.0) { 6 return 0.0; 7 } 8 double a = 1.0 < v ? v : 1.0; 9 double r = 0.0; 10 11 while(0.0 < a) { 12 double t = r + a; 13 14 if(t * t <= v) { 15 r = t; 16 } 17 a /= 2; 18 } 19 return r; 20 }

投稿2015/05/14 23:57

編集2015/05/15 00:51
IchigoTaruto

総合スコア159

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問