• ベストアンサー

引き放し法による除算アルゴリズムについて

突然の質問失礼いたします。 現在私は学校で引き戻し法・引き放し法といった除算のアルゴリズムについて学んでいるのですが、そのうちの引き放し法について質問したく投稿しました。 引き放し法について自分で勉強しようと思い、いろいろ調べていたのですが、商と余りを出す引き放し法は見つかっても、小数点以下にわたってまで商を求める引き放し法がまったく見つかりませんでした。 (例えば5÷2=2あまり1と結果を出すのではなく、5÷2=2.5と結果を出す引き放し法のことです。) 少数点以下にわたってまで商を求める引き放し法は商と余りを出す引き放し法で表現できるのでしょうか? もしよろしければ教えていただけると幸いです。また、参考にすべきインターネットサイト等もあれば教えていただけると助かります。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★30÷8と考えます。 >3÷8などと言った被除数<除数の場合は同じ方法でやってみると >解がでない気がするのですが・・・。  ↑  解けます。 ・3÷8 は商が 0 となりますがこの時は 3×10=30 から 8 を割ればよい。  よって  (1)3÷8=0  (2)30÷8=3あまり6  と計算します。0、3あまり6 と出ますから 0.3 となるわけです。 ・あまりの 6 は計算を続けて  (3)6÷8=0  (4)60÷8=7あまり4  となります。ここで 0.3 に 7 を追加して 0.37 となります。 ・あまりの 4 は計算を続けて  (5)4÷8=0  (6)40÷8=5あまり0  となります。ここで 0.37 に 5 を追加して 0.375 となります。 ・割り切れたので 3÷8=0.375 となります。  このように『被除数<除数』の場合は10倍して繰り返します。  それでは宿題として3÷800はどうなるでしょうか?  出来たら補足などに書き込んでみて下さい。 ・以上。

elefire37
質問者

補足

解答してみました。 (1)3÷800=0 (2)30÷1800=0 (3)300÷800=0 (4)3000÷800=3あまり600 0.003 (5)600÷800=0 (6)6000÷800=7あまり400 0.0037 (7)400÷800=0 (8)4000÷800=5 0.00375 よって解は0.00375。でしょうか。大変わかりやすい回答ありがとうございます! 大変図々しい気はするのですが、どうしてもプログラミングが前に進まないのでもう一度だけ補足をさせてください! 10進法によるアルゴリズムは容易に出来たのですが、後日の追加条件でプログラミングがアセンブリ言語を用いなければならなくなった為、2進法で行わないといけないみたいで・・・。 10進法による引き放し法は上記のように簡単に出来ることがわかりましたが、2進法でも1÷17といった除数>被除数の割り算を引き放し法で行うことは可能なのでしょうか? 10進法の方法を応用してみようと考えてみましたが、10進法では10倍を行っている箇所が2進法では表現しにくい気がしまして・・・。 ちなみに除数<被除数の割り算は検索をかけたらいろんな場所で出てきました。 たびたびな質問で大変申し訳御座いません。

その他の回答 (5)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.6

既に詳しい回答が付いてますが、プログラムするのに、アルゴリズムのわかりやすそうな参考サイトは、以下かな? 2進数の場合 http://jndb.pc.mycom.co.jp/column/architecture/085/index.html 10進数 タイガー計算機での解説、小数点以下も、計算機の桁の許す限り計算可能 http://www.wizforest.com/gear/tiger/ おまけ タイガー計算機の歴史 大正時代から日本はこんなすごいもの作ってたんですね。 http://www.tiger-inc.co.jp/temawashi/temawashi.html

elefire37
質問者

お礼

下のふたつのサイトは見たことありますね。一番上のサイトは大変詳しくのっているので是非参考にさせていただきます。 わざわざ紹介していただき本当にありがとうございました! この引きはなし、引き戻し法を学んで、いつも何気なく使っている割算がこんなに手順を踏んだ計算を行っているのには驚きでした。プログラミングとしての意味だけでなく、数学的な意味でも大変深い学問ですね。本当に興味を持ちました。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★アドバイス >2進法でも1÷17といった除数>被除数の割り算を引き放し法で行うことは可能なのでしょうか?  ↑  可能です。というよりは出来ます。 >10進法の方法を応用してみようと考えてみましたが、 >10進法では10倍を行っている箇所が2進法では表現しにくい気がしまして・・・。  ↑  10進法で10を掛けてから引いています。  2進法なら2を掛けてから引けば良いだけです。  つまり基数(n進数のn)の数を掛けるわけです。 ・なお2進法で2を掛けるという事は、左に1ビットシフトすることと等しいですが分かりますか?  そもそも10進法で左に1桁シフトするとは、10を掛ける事になるのです。 >ちなみに除数<被除数の割り算は検索をかけたらいろんな場所で出てきました。  ↑  でしょうね。  定番だから。  いや基本だから。 ・以上。ちなみに『3÷800』の解答は完璧です。2進法も同じ要領で0を増やせば簡単です。

elefire37
質問者

お礼

なるほど・・・。毎回ながら大変詳しい解説ありがとうございます。 左へのシフト作業は引き戻し法にて使用したので理解できます。 おかげで大体のアルゴリズムをかけました。 本当にありがとうございました!

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★5÷2=2.5の場合。 ・商の 2 が出るのは分かりますよね。  そしたら割り切れるまで 10 を掛けて計算します。  (1)5 -2 -2 = 2あまり1  (2)あまり1に10倍して 10 から引き始める  (3)10 -2 -2 -2 -2 -2 = 5あまり0  ここで終了する。  このとき (2) で 10 倍しているので (3) で出た 5 は 10 で割ります。  すると 0.5 です。商の 2 と小数部の 0.5 を足して 2.5 となります。 ★7÷3=2.333…の場合。 ・商の 2 は分かりますよね。  (1)7 -3 -3 = 2あまり1  (2)あまり1に10倍して 10 から引き始める  (3)10 -3 -3 -3 = 3あまり1  (4)(2)と同じ方法を繰り返す  この7÷3は永遠にあまりが 1 となるため循環小数となります。  よって無限に計算し続けます。  適当に計算を終了する小数点の桁数を決めて打ち切ります。 まとめ: ・基本は割り切れるまで余りに 10 倍して引き算を繰り返します。  循環小数も考慮して適当に計算を終了させます。  例えば小数点以下 100 桁で終了とか。 ・以上。

elefire37
質問者

お礼

なるほど!! 思わずうなってしまうような解答本当にありがとうございます。 プログラムを作成する場合は余りが生じた場合と生じない場合で分岐させて、分岐した場所で10倍した後に順に引いていくという作業をやればいいってことになるのでしょうかね。 頭の中でアルゴリズムが浮かんできたので早速書いてみます。 本当にありがとうございました!!

elefire37
質問者

補足

すいません、また問題が発生しまして・・・。 5÷2や7÷3などの被除数>除数の場合は上記の方法で解けるのですが、3÷8などと言った被除数<除数の場合は同じ方法でやってみると解がでない気がするのですが・・・。 このような場合も上記の方法で解けるのでしょうか?それとも別の方法があるのでしょうか? 度々すいません。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

小数点に到達してもそこでやめないで 反復を繰り返せば良いだけではないの? (被除数が5なら、5.000…と0がどこまでも続いていると考える。) もちろん、無限に続けるわけにいかないので何処かで止める必要はありますが。

elefire37
質問者

お礼

引き放し法で試しに小数部に至るまで反復をしてみたんですが、なぜか答えが一致しなかったんですよね・・・。自分の計算ミスなのかもしれませんが・・・。 ちょっともう一回計算をやりなおしてみます!ありがとうございました。 引き続き皆様からのアドバイスを募集しています。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

「引き放し法」でググってみると、100以上のサイトがヒットします。 どれが参考になるかは、わかりません。

elefire37
質問者

お礼

ググったサイトは一通り見てみましたがやはり余りを出す方法しか見つかりませんでした・・・。 やはり別の方法があるのでしょうかね。アドバイスありがとうございます。