• ベストアンサー

2進数の小数計算について

コンピュータは0と1の2進数で計算しますが、小数点の計算は苦手だと聞いています。 実際、消費税の0.05を2進数で表現することは出来ません。では、どうやってコンピュータで小数点の計算しているのですか?

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

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

一般的には、ある程度の誤差を承知の上で、近似値を使って計算します。Microsoft Excel などのソフトはこの方法を使っています。誤差が出ても四捨五入などで誤差を隠すことができるので、実用上は問題ありません。 (例: 10.00000003 → 10) 誤差のない正確な計算をしなければならないときは、分数に直します。 (例: 0.05 → 5/100) これなら整数同士の計算だけで済むので誤差は出ません。 実際にこの方法を使う場合は、分母を一定の値に固定して分子だけを処理するなどの工夫をします。 例えば 12.34 + 3.5 = 15.84 は分母を100に固定して分子のみを計算すると 1234 + 350 = 1584 というようになります。(固定小数点方式)

yukikundesuyo
質問者

お礼

固定小数点方式を調べて納得いきました。 ありがとうございます。

その他の回答 (2)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

近似値で計算します。 たとえば、我々が1/3を数値として計算する場合、 1/3→約0.3333とおきかえて計算します。 それでもあまり実用的には問題ありません。 0.05を2進数で表せば0.0000110011001100....と循環小数になりますが、 適当なところで切って表現します。 たとえば0.0000110011ぐらい…。 (実際の処理系では、どのくらいのビットで数を表現するかは、 IEEE754という規格で決まっています) コンピュータ内部で計算する場合はこの適当なところで切った数を使っています。 最後に10進法に戻します。

回答No.1

仮想的な小数点を想定して計算することができます。 例えば、8bitで小数を表すとして、上位4bitで整数部分、下位4bitで小数部分を表すとします。 このとき、各桁の値は8bit目から順に、 2^3,2^2,2^1,2^0,2^-1,2^-2,2^-3,2^-4 となります。 つまり、仮想的な小数点が4bit目と5bit目の間にあると考えた場合、 00010100 は、 2^0+2^-2=1.25 となります。 bitうんぬんの話が良くわからなかったら、2進数少数は 1.01 といった形で表し、この値は 2^0+2^-2 で計算するものだと理解してください。 この方法は固定小数点といって、プログラムなんかで使おうと思うと結構めんどくさいです。 c言語の数値型には浮動小数といったものが出てきますが、これは計算機のbit幅によってフォーマットが決まっており、2進数の数字列の中に、仮数、基数、指数を与えることで小数を扱っています。 こんな感じでよろしかったでしょうか? 詳しくは参考URLを見てください。

参考URL:
http://white.sakura.ne.jp/~rryu/compfund/
yukikundesuyo
質問者

お礼

C言語の浮動小数(float型)の内部構造はそういう風になっていたのははじめて知りました。ありがとうございます。

関連するQ&A

  • コンピュータ小数点2進数

    ・コンピュータ内で「小数点以下を含む数」をデータとして表現する方法についてまとめよ。 (コンピュータ内で、メモリに記録される0と1の列によって小数点以下を含む数を表すのにどのようなルールが用いられているのか、つまり小数点以下を含む数のためのデータ解釈のルールを問う) このような問題あなたならどう回答を出しますか??

  • 10進数 → 2進数

    小数点を含んだ実数の、10進数から2進数への変換のやり方がよくわかりません。できるときとできないときがあります。たとえば、 (0.1)_10 = (0.0001100110011・・・)_2 ※(A)_xとは、数値Aのx進数表現というイミです。以下もこの表現を使います。 となるらしいですが、どうやればいいのでしょうか?わかりません。 また、ついでに聞いておきたいことがもう一つあります。小数点を含まない数値の 変換も教えていただきたいです。 たとえば今までぼくは、(101)_10を2進数に変換するのに、 (101)_10 = (100 + 1)_10 = ( 2^2・25 + 1 )_10 = ( 2^2・( 2^3・(2 + 1) + 1 ) +1 )_10 = (2^6 + 2^5 + 2^2 + 2^0 )_10 = (1100101)_2 などという、めんどくさいことをやっていたのですが、もっとスマートなやりかたはないでしょうか? コンピュータもいちいちこんなやり方でやっていたら、計算量多すぎてやってられないような気がするので、きっとあると思うんですけど…簡潔なアルゴリズム…

  • 2進数の計算や小数点表現などを解説しているサイト

    2進数の計算や小数点表現などを分かりやすく解説しているサイトを探しています。できれば初心者から熟練者まで役に立つサイトがいいです。ご存知でしたら教えてください。

  • 消費税の計算について教えて下さい。

    消費税の計算について教えて下さい。 とある業者から仕入をして、納品書をみて計算したんですが、小数点以下を四捨五入してるんですよ。 小数点以下は切捨てって聞いたことがあるんですが、実際のとこはどうなんですか? 宜しくお願い致します。

  • 小数点の逆算の計算で解き方がわかりません。

    小数点の逆算の計算で解き方がわかりません。 問題:2.8×1.7=28×□ □にはいる数を答えよ 私は計算せずに単純に2.8:28と1.7:○で、小数点一個下げて「0.17」と回答を出しました。 これを計算式で出そうとおもうとうまくいきません。 2.8×1.7=4.76 4.76=28×□ □=28/4.76 □=5.88・・・ となり答えが違ってしまいます。 どこの考え方がおかしいのでしょうか? ご存知の方がいらっしゃいましたら教えてください。

  • 16進数から10進数への計算

    16進数から10進数の計算について質問です。 23.5Cという問題があった場合、5Cの部分の計算について質問で、そこは小数点の部分です。 式が、5 x (1/16*1) + 12 x 1/16*2)とか書いてあったのですが、なぜ16分の1の二乗になるのかわかりません。1/10、1/100と、10進数のマイナスの小数点の場合はなっていくのではないでしょうか? すごくわかりやすく説明していただければ助かります。 小学生の子どものように。全然わかりませんので。

  • 進数の計算です

    この計算をお願いします。 できれば、途中計算もお願いいたします。)右の数字は進数を表します 1)(26)10を2進数に。 2)(0.57251)10を2進数に 小数点以下5桁までです。 3)(26.57251)10を2進数に これも同様です。 4)(26)10を8進数に 5)(26)10を16進数に 6)(110101)2*(111)2 7)(1101000)2/(110)2 8)(26)10*4を2進数で表す 9)(26)10/4を2進数で表す かなり多いですが、わかるところだけでもお答えいただけたら幸いです。 お願いいたします。

  • EXCELの小数計算について

    EXCEL97で小数計算をすると誤差がでるのですが何故ですか? A列に14.60を数値入力  B列に13.90を数値入力  C列に=B1-A1の数式をいれると-0.70となるはずなのにどういうわけか -0.699999999999999と表示される。 小数点以下14桁目までは-0.70000000000000と表示されるが15桁目で上記のように表示される。 表面上はROUND関数などで処理できるのですが複数の数式を組み合わせて計算している時は-0.69999・・・の数値をもって計算される場合があり誤差がでる。 消費税や金利計算などで1円でも誤差がでると表計算の正確さが問われてしまう。 0.7の他にも 次の場合もでる 0.2のとき0.1999・・ 0.3のとき0.2999・・・・ 0.8のとき0.7999・・・・ これはEXCELのバグなのでしょうか?

  • 小数点の計算をはずしたいです

             1       2        3        4 A              3000       700      4(4.28) B      12000(12840) A2÷A3の答えが、実際は(4.28)なのですが、表示上は小数点を入れず 4にしています。 B1に、A2×A4の答えを載せたいのですが どうしても小数点も含めて計算してしまいます。 単純に3000×4の答えをB1に入るようにしたいのですが どなたかお教え願えませんでしょうか? 宜しくお願いします。

  • "2進数"で負の小数点の表し方?

    2進数で、負の整数の表現方法は分かるのですが 小数点となると分かりません。 質問(1)  ・上位1bitを符号ビットとする4bitで2進数を表すと  10進数 → 2進数    7 → 0111    1 → 0001    0 → 0000   ー1 → 1111   ー8 → 1000  さらに、小数を表す1bit追加すると   0.5 → 00001 ?   -0.5 → 11111 ?  上記であってますか?  そして、0.75は?000011?  以上、宜しくお願い致します。

専門家に質問してみよう