ニュートン法を用いた割り算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
suzu

ニュートン法を用いた割り算

#1

投稿記事 by suzu » 16年前

学校の課題なのですが、
C言語で”/”記号を使わずにニュートン法を使って割り算の答えを出すプログラムを作れ。
とのことなのですが、
色々と調べてもみたものの、まったくといって良いほど分かりませんでした。
同じ様な課題でニュートン法を使って√の答えをだせ、というプログラムは一応作ることが出来ました。
#include <stdio.h>
#include <math.h>

int main(void)
{
    double a,b,c=10.0;
    int d=0;
    const double eps=10e-11;
    printf("Input Number\n");
    scanf("%lf",&a);
   
    while (fabs(c-b)>=eps){
        b=c;
        c=(b+a/b)/2.0;
		d=d+1;
		printf("%10.9f\n",c);
    }
    printf("roop%d\n",d);
    return 0;
}
ほぼ丸投げという形になってしまって申し訳ありませんが、どうかお願いします。

Mist

Re:ニュートン法を用いた割り算

#2

投稿記事 by Mist » 16年前

学校の課題にきちんと授業を受けていて解けない問題が出されることはありません。
自業自得です。
ここで回答を丸写しして提出するより正直に報告するか、もしくは友達に教えてもらう
ほうがよほどあなたのためになります。
がんばってください。

#余談
こことか、知恵袋とかOK Webのようなググるで上位にくるようなところは先生も見ている
可能性が高いためどのみちバレますよ。
証拠があるわけじゃないけどさ。

suzu

Re:ニュートン法を用いた割り算

#3

投稿記事 by suzu » 16年前

私の学校の先生はなぜかまったく授業をしないんです。
講義時間中は一番最初に課題だけ出して後は完全に放置といったわけの分からない授業なんです。
実際、私は課題を出されて調べるまでニュートン法は一切聞いたこともありませんでした。

ここでいただいた回答は、丸写しにするつもりはありません。
自分なりに分解して色々と試してみるつもりです。

というか、この掲示板の主旨は
C言語での質問をさせていただいて、それに答えをもらう。
というものではないのでしょうか?
自分でやったほうが自分のため、という意見はその通りだと思いますが、
ここで教えていただくことと友達に教えてもらうことに違いがあるとは正直思えません。(というか、友達も一人も出来ていませんでした。)むしろ、プログラムに慣れている方の回答を見て、勉強したほうがより勉強になると思って書き込ませていただいたのですが。

何の手がかりもなしに一からこの課題を解くには私は力不足です。
計算部分のヒントだけでもいただけないでしょうか?

たかぎ

Re:ニュートン法を用いた割り算

#4

投稿記事 by たかぎ » 16年前

> 私の学校の先生はなぜかまったく授業をしないんです。
> 講義時間中は一番最初に課題だけ出して後は完全に放置といったわけの分からない授業なんです。
> 実際、私は課題を出されて調べるまでニュートン法は一切聞いたこともありませんでした。

学校といってもどんな学校か分かりませんが...
高等教育であれば、教員に手取り足取り教えてもらうところではなく、自発的に学習するのが原則です。
先生は当面の目標だけを設定して、細かい部分は学生に質問させることを前提としているのかもしれませんよ。

> というか、この掲示板の主旨は
> C言語での質問をさせていただいて、それに答えをもらう。
> というものではないのでしょうか?

まあ、とりあえず規約に目を通してください。
http://l.huu.cc/board/board.html

もし理解できない場合は、その旨を告知してください。

> こことか、知恵袋とかOK Webのようなググるで上位にくるようなところは先生も見ている
> 可能性が高いためどのみちバレますよ。

というか、回答者の中にいるかもしれませんね。

管理人

Re:ニュートン法を用いた割り算

#5

投稿記事 by 管理人 » 16年前

ルートのプログラムはできたという事ですが、
bに値が代入されていないのに計算に使っているのでおかしくないですか?
こちらでは実行エラーになりました。
数学的な話はよくわかりませんが、計算方法さえわかれば解けると思います。
プログラムの掲示板なので、プログラムに詳しい人は集まっているでしょうけど、
数学的に詳しい人がたくさんいらっしゃるとは限らないと思いますので、
「数学的にはこういう理論なんだけど、これをプログラムで実装するにはどうしたらいいか」
という質問の仕方の方が回答も集まると思います。

Haru

Re:ニュートン法を用いた割り算

#6

投稿記事 by Haru » 16年前

>管理人さん
>数学的に詳しい人がたくさんいらっしゃるとは限らないと思いますので、
>「数学的にはこういう理論なんだけど、これをプログラムで実装するにはどうしたらいいか」
>という質問の仕方の方が回答も集まると思います。

プログラムもまだまだ未熟で数学はさっぱりな私から言わせてもらうと、
さっぱりわかりません!ニュートン法というものをグーグル先生に聞いてみましたが…
理解不能だったので断念しました(汗)

>何の手がかりもなしに一からこの課題を解くには私は力不足です。
>計算部分のヒントだけでもいただけないでしょうか?

という、事で全くわかりませんが、グーグル先生に『ニュートン法 割り算』
ときいたら・・・これかなぁ?
というようなものがそれなりにヒットしましたよ。

Haru

Re:ニュートン法を用いた割り算

#7

投稿記事 by Haru » 16年前

>bに値が代入されていないのに計算に使っているのでおかしくないですか?
>こちらでは実行エラーになりました。

連レスすみません。b=0でした。
下のような実行結果でした。
Input Number
3
5.150000000
2.866262136
1.956460732
1.744920939
1.732098271  ↓この下からが答え(ですよね?)
1.732050808
1.732050808
1.732050808
roop8

Mist

Re:ニュートン法を用いた割り算

#8

投稿記事 by Mist » 16年前

私の言いたいことはたかぎさんと管理人さんと同じなんですが

数学的にこういうふうに計算すればよいことはわかるが、それがC言語でどう表せばいいのかわかりません。
ということであれば回答できますが、ニュートン法を使っての割り算の自体が皆目わかりませんというので
あればプログラム以前の問題ですので数学系の質問掲示板にいかれたほうがよいと思います。

たいちう

Re:ニュートン法を用いた割り算

#9

投稿記事 by たいちう » 16年前

問題を勘違いしているということはないですか?
Newton法で割り算の答は出せません。
無理やりNewton法で計算しようとしても、
次項を求めるための計算に割り算が出てきます。

割り算の演算子を使わないで、割り算の答を出すことならできます。
商の範囲を予め決めておいて、範囲の中央の値に除数をかけ、
被除数と比較することで、商と中央値の大小を判断でき、
商の範囲が半分になります。これを繰り返せば必要な精度で商が得られます。

予め決めておく商の範囲ですが、色々こだわることもできますが、
とりあえずは0~1e100とかで実用上問題ないかと。

# 多分ないと思いますが、私が理解しているよりも「Newton法」という
# 言葉の表す範囲が広いのかもしれません。
# また、トリッキーな方法で割り算を避けるNewton法が存在するかもしれません。
# この場合は、課題として適切ではないと思います。

suzu

Re:ニュートン法を用いた割り算

#10

投稿記事 by suzu » 16年前

Haruさんの仰る通り、googleで調べてみたところ、
http://journal.mycom.co.jp/column/archi ... index.html
というページが見つかり、それを参考に一応完成させることが出来ました。
質問の仕方などで至らない点が多々あり、申し訳ありませんでした。

ただ、完成したというのは、一応答えは出る。というだけで、とても効率的とは思えません。
アドバイスなどあったらよろしくお願いします。
#include <stdio.h>
#include <math.h>

int main(void)
{
    double a,b,c=0.0,x=0.0,xi=0.000000001;
    int d=0;
    const double eps=10e-11;

    printf("Please Input Number A\n");
    scanf("%lf",&a);
    printf("Please Input Number B\n");
    scanf("%lf",&b);

    while(fabs(xi-x)>=eps){	
	x=xi;
	xi=xi*(2-(xi*b));
	d=d+1;
	printf("%10.9f\n",xi);
    }
    c=a*xi;
    printf("A/B=%10.9f\n",c);
    printf("roop%d\n",d);
    return 0;
}
>たいちうさん
ニュートンラプソン法とニュートン法は別物なのでしょうか?
だとしたら申し訳ありませんでした。

Mist

Re:ニュートン法を用いた割り算

#11

投稿記事 by Mist » 16年前

効率について私から指摘はありませんが動作について2点指摘があります。

1.Bに0を設定できる
現状のプログラムだとwhileから抜けてこずに例外終了します。
以下のような制限を設けるほうがいいのではないでしょうか。
scanf("%lf",&b);
if (b == 0.0) {
    printf("0割りは出来ません\n");
    return 1;
}
2.Bに負値を設定したときに例外終了します。
私では計算部分の間違いはわかりませんが、問題ではないでしょうか。

たいちう

Re:ニュートン法を用いた割り算

#12

投稿記事 by たいちう » 16年前

> ニュートンラプソン法とニュートン法は別物なのでしょうか?

同じです。私が思いつけなかっただけで、
割り算を避けるトリッキーでない方法があるのですね。
ノーヒントだと時間をかけても私には解けなかったかもしれませんが、
課題として適切でない、というのは言いすぎでした。

> だとしたら申し訳ありませんでした。

こちらこそ混乱させ申し訳ありませんでした。

suzu

Re:ニュートン法を用いた割り算

#13

投稿記事 by suzu » 16年前

>Mistさん
ご指摘どうもありがとうございました。
0で割ることや、-のことをすっかり失念していました。
#include <stdio.h>
#include <math.h>

int main(void)
{
    double a,b,c=0.0,x=0.0,xi=0.000000001,y;
    int d=0,e=0;
    const double eps=10e-11;
	
    printf("Please Input Number A\n");
    scanf("%lf",&a);
    printf("Please Input Number B\n");
    scanf("%lf",&b);

    y=b;

    if(b==0.0){
        printf("0割りは出来ません\n");
        return 1;
    }
    if(b<0.0){
        b=b*(-1);
        e=1;
    }
	
    while(fabs(xi-x)>=eps){	
        x=xi;
        xi=xi*(2-(xi*b));
        d=d+1;
        printf("%10.9f\n",xi);
    }
	
    c=a*xi;
    if(e==1)
        c=c*(-1);
    printf("A/B=%10.9f %10.9f %10.9f\n",c,a/y,(a/y)-c);
    printf("roop%d\n",d);
    return 0;
}
力技といった感じになってしまいましたが、数値はちゃんと出るのでこんな感じでしょうか?

Mist

Re:ニュートン法を用いた割り算

#14

投稿記事 by Mist » 16年前

たいしたことではないですが。

変数eって必要でしょうか?
bに入力された値はyに退避していますよね。
なので

if(e==1)

if(y<0.0)

でも同じことですよね。
変数をひとつ減らせます。

あとは書き方ですが
d=d+1;
c=c*(-1);

などは

d++; または ++d;
c*=-1;

と省略してかけます。

suzu

Re:ニュートン法を用いた割り算

#15

投稿記事 by suzu » 16年前

なるほど。
早速ご指摘いただいた点を修正させていただきました。

みなさんのおかげで無事にプログラムを完成させることが出来ました。
本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る