• ベストアンサー

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

突然の質問失礼いたします。 現在私は学校で引き戻し法・引き放し法といった除算のアルゴリズムについて学んでいるのですが、そのうちの引き放し法について質問したく投稿しました。 引き放し法について自分で勉強しようと思い、いろいろ調べていたのですが、商と余りを出す引き放し法は見つかっても、小数点以下にわたってまで商を求める引き放し法がまったく見つかりませんでした。 (例えば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% (2126/6288)
回答No.1

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

elefire37
質問者

お礼

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

関連するQ&A

  • 除算について

    こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させていただきます。 まず、9÷3 について9と3をビットで表し 筆算をしてみたところ、次のようになりました。     11 11/1001    11   ------     11     11   ------      0 ----------------------------------------------- 次に 3÷7 について考えてみたのですが 操作(A),(B) について以下のように決めます (A) ある自然数 n を10倍する 10n = 2 * ( 4n + n ) だから ( n を2ビット左にシフトして n を足したもの ) を 1ビット左にシフトする ---- (1) (B) 与えられた数を10倍した回数を k とする。 ( 与えられた数を10倍するたびに k が 1 ずつ増加していく ) --- (2) 3÷7 をビットで表した筆算をすると まず商が整数で求められないので (A) (B) により 3を10倍してkをインクリメント 30 をビットで表したものは 11110 になる。 これを筆算すると ビットで表した商は 100 余りは 10 10進法だと 4 余り 2 になる。 さらに余りの 2 を10倍して k をインクリメント ビットの筆算をしていく ・ ・ ・ ここで質問させていただきたいのですが、 (1) このようにすると小数第k位の商が 10進法では正確に表していけると思うのですが、 誤差が生じる場合もあるのでしょうか? (2) 別のタブを用いて見ていただきたいのですが、 以下のサイトでは long double などの計算についての 誤差について示していますが、 http://www.seiai.ed.jp/t2000/java/jv014c.html double について誤差がでるのは、 double では (ある数)* (ネイピア定数の累乗) で表しているからでしょうか? 小数の部分もビットで表しているからでしょうか? ご存知のかた、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 算術演算子にて、整数での除算処理は商になる?

    JAVAのプログラミングを勉強しているのですが、JAVAの算術演算子にて、 参考書に「除算演算子は割り算を行うものだが、整数同士の割り算を用いると「商」を計算する」と書かれているのですが、これはどういう意味でしょうか? 整数同士の割り算をすると、小数点ではなく四捨五入をした整数値が出力されるのでしょうか?

    • ベストアンサー
    • Java
  • 10進法から2進法へ。

    こんにちは^^)今レポートをやっています。 2進法を10進法に直すやり方は、自分なりに理解できました。 ですが、10進法を2進法に直すとき、なぜ2で割り余りを明記していくのか、その理由がわかりません。しかも以下問題文の答えは、(101100)だと思うのですが、他の位は全て余りを明記してるのに、この数の一番大きい位の1だけは、3÷2=1あまり1の商を明記してるんですよね?なぜでしょうか? (問題) (108)10を2進法になおせ。 この問題で、わかりやすく説明していただけないでしょうか? よろしくお願いします。質問は、以下の2点です。 (1)10進法から2進法になおすとき、なぜ2で割りあまりを明記するのか? (2)なぜ、あまりだけを明記するのではなく商も明記するの??

  • 2進数の除算について

    タイトルどおり、2進数の除算についてわからいので質問をします。 (1)割り切る方法と(2)余りを出す回答があるようなのですが、どこのサイトを見てもいまひとつ理解ができなくて困っています。何か具体的な例を挙げていただきたいと思います。 それに加えて、前者の割り切る方法の結果から分かること(法則性)も知りたいのですが、両者について分かる方がいらっしゃれば、どうかお力添えをお願いします。

  • A*アルゴリズムとダイクストラ法について

    A*アルゴリズムとダイクストラ法について質問です。 (1)A*アルゴリズムは万能のように思えるのですが、どのようなデメリットがありますか? (2)ダイクストラ法がA*より優れている点はありますか? A*アルゴリズムを調べてみたのですが主なデメリットは見つけられなかったので疑問に思いました。 回答よろしくお願いします

  • 四則演算についてです

    四則演算の除算法についてですが {23/6}を2進数で求めたいです。 但し、被除数は6ビット、除数は4ビットという条件付き。 23=(0 10111)2 6=(0 110)2 2の補数を用いて-6=(1 010)2 減算結果が正の場合、商として1をたて 減算結果が負の場合、商として0を立てるのですが 010111 +)1010    商 --------- 111111 …0 +) 1010 --------- 1010011 …0 +) 1010 --------- 1101 …0 +) 1010 --------- 10111 となってしまい商と余りがうまく出ません! 間違ってるところ教えてください!

  • 10進数→n進法の変換 整数と小数の違いについて

    整数の場合 27という10進数の数を2進法にしたい場合 2で割り、2のまとまりを作り余りが出来ると、それを1の位の値にする と、このようなことを繰り返すことで2進法の表記を作り上げると思います。 小数の場合 0.8125という10進数の数を2進法にしたい場合 2を掛ける(=0.5で割る) ことで 0.5のまとまりを作り、商の整数部分を0.5のまとまりと考え少数第一位の値とする と、このようなことを繰り返すことで2進数の表記を作り上げると思います。 と、ここまでは理解できたのですが なぜ整数では、小さい桁から、まとまりを作っていくのに 小数では大きい桁から、まとまりを作っていくことになるのでしょうか? この疑問を自分の中でうまく言葉に出来ず、もどかしいので説明できる方がいましたら 私のレベルでも理解できるように説明していいだけないでしょうか。 よろしくお願いします。

  • 10進数から2進数への変換の仕方について

    10進数から2進数への変換の仕方について 以下のサイトに説明があったのですが、 http://www.pursue.ne.jp/jouhousyo/sysad/sysad010.htm 10進数の60を2進数に変換する場合、変換したい10進数を商が0になるまで2で割りつづけ商と余りを求めていますが、その時に、15/2などは7.5になり余りが、説明では商が7、余りが1になっています。 10進数から2進数へ変換する場合は、小数点以下の余りはすべて1として計算するのでしょうか?

  • ACCESS 除算での小数点切上げ方法

    こんにちは。 ACCESSを使った入力フォームにて、除算の自動計算を考えております。 テキストボックスAに入力された数値÷テキストボックスBに入力された数値  の結果をテキストボックスCに小数点切り上げで計算するにはどうしたらいいでしょうか? ご回答よろしくお願いします。

  • アルゴリズムプログラミング

    アルゴリズムにおいて以下のような課題が出たのですかその実行結果を出すためのソースプログラム、または実行結果をどなたか教えてください! (1)バブルソート、選択ソート、挿入ソートプログラムに対して、実行時間(小数点以下2桁まで)、比較回数、代入回数をデータ数50000、100000、150000、200000の4つの場合でそれぞれ測定せよ。ただし対象データはランダム関数SFMTを利用して作成するものとする。 (2) ヒープソート、クイックソートとマージソートプログラムの実行時間(小数点以下2桁まで)、比較回数、代入回数をデータ数50000、100000、150000、200000の4つの場合でそれぞれ測定せよ。ただし対象データはランダム関数SFMTを利用して作成するものとする。 SFMTは以下のサイトからSFMT-srcー1.3.3.zipをダウンロードして解凍する。 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html#SFMT そのうち必要なファイルは sfmt.h sfmt.c sfmt-params.h sfmt-params19937.h を使用する。 どうぞよろしくお願いします。

専門家に質問してみよう