• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:除算について)

除算についての疑問

このQ&Aのポイント
  • 除算についての筆算の方法と、小数の誤差について疑問があります。
  • 特に、ビット演算を使用した計算方法について教えていただきたいです。
  • また、double型の誤差についても知りたいです。

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

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.4

> Java の double において小数を含む四則演算をするときには、 > 仮数部で表現しきれない数値をもちいて演算するとき のみ誤差が出るのか,という確認ということでよいですか? (a) 普通の電卓では誤差が出ないのに,double型をそのまま用いているプログラムでは発生する誤差(回答ANo.3のリンク先を参照) についてはそのとおりです。有限ビット長の仮数部で数値が正確に表現できているのなら(a)の誤差は出ません。 ただし次の(b)の誤差は,有限ビット長の仮数部で数値が正確に表現しきれていても発生します。 (b) 普通の電卓でも発生する誤差( http://ja.wikipedia.org/wiki/%E8%AA%A4%E5%B7%AE の「2.3 情報落ち」「2.4 桁落ち」を参照)

noname#173931
質問者

お礼

お礼が遅れてしまい大変申しわけありません。 誤差につきましては、また改めて質問させていただきたいと思います。いったん質問を締め切らせていただきます。 貴重な時間をさいての回答、ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

(1) int n = 8 / 5; という演算が1.6にならず整数型変数nに1が格納されるのは誤差と呼べる現象ですよね。であるなら,そのデータ形式で「表現しきれない数値をもちいて演算するとき」というのが要点で,小数や仮数部には限定できないでしょう。 私の回答ANo.2も,アルゴリズムによって求めることで表現するけた数をいくらでも伸ばせるという箇所に力点が置かれています。したがって浮動小数点形式であっても,アルゴリズムによって仮数部の長さをいくらでも伸ばして計算を繰り返せるのであれば,小数第k位までの商を10進数で正確に求めることができます。 (2) はい,そのとおりです。 (3) 数字キーが一つ押されるたびに即座に計算をするのではなく,一つの数値として認識できる一連の数字文字列のかたまり(例えば -314.159 という8文字)が揃ったあとで計算を開始するのが通常の処理方法でしょう。 > コンピュータの内部では 10 の累乗の割り算なのでしょうか? > 数字の入力の際には整数を入力するので誤差は生じないのでしょうか? 次のリンク先を参照。 http://xperia-fan.jp/community/contents/%E9%9B%BB%E5%8D%93%E3%81%A7%E3%80%81%E8%A8%88%E7%AE%97%E7%B5%90%E6%9E%9C%E3%81%8C%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E3%82%8B%EF%BC%88%E3%83%90%E3%82%B0%E7%99%BA%E8%A6%8B%EF%BC%81%EF%BC%89 http://woz-notes.blogspot.jp/2012/10/android-decimal.html

noname#173931
質問者

お礼

さっそく回答していただきありがとうございます。 恐れ入りますが、 自分の質問 (1) への回答について質問させていただきます。 Java の double において小数を含む四則演算をするときには、 自分の (1) のような理解でよいのでしょうか? しかし、自分の示したサイトなども見ていただいて 回答していただき、ありがとうございました。

すると、全ての回答が全文表示されます。
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

(1) いいえ,誤差は生じません。整数だけを用いたアルゴリズムによって求めていますから,小数第k位までの商を10進数で正確に求めることができます。 (2) eの累乗ではなく,2の累乗を用いたIEEE754浮動小数点数形式で格納しています。 http://okwave.jp/qa/q7461149.html の私の回答ANo.4 http://okwave.jp/qa/q3739494.html の私の回答ANo.3 http://okwave.jp/qa/q6895779.html の私の回答ANo.1

noname#173931
質問者

お礼

お礼が遅れてしまい申しわけありません。 以下のサイトでIEEE754 について見てみました。 http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml 失礼しました e の累乗ではありませんでした。 恐れ入りますがもう少し教えていただきたいのですが・・・ (1) 四則演算において誤差が出るのは、 仮数部で表現しきれない数値をもちいて演算するときである、 小数のときである。 このような理解でよいのでしょうか? (2) それと、上記サイトの後半にある 「入りきらない数の丸め方」の項目の最後にある 「最後の桁の半分より大きいので切り上げる」の説明文というのは 仮数部の最後の桁が1であり、 その次の入りきらないところの最初の桁は1 なので、 これは2進数ではすぐ上位のビットの半分である。 さらに そのあと、1であるビットも続くので (入りきらない部分) は ( 最後の桁の半分 ) より大きい、 ということなのでしょうか? (3) Java で電卓を作っているのですが、小数を入力する際、 小数点ボタンをおしたあと、小数部分を入力していくときには、 変数kがあるとして、 k を 1 ずつデクリメントして 押した数値に 10 の k 乗を かけることになると思うのですが、 コンピュータの内部では 10 の累乗の割り算なのでしょうか? 数字の入力の際には整数を入力するので 誤差は生じないのでしょうか? もしよければ、教えていただけないでしょうか? よろしくお願いします。

すると、全ての回答が全文表示されます。
  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.1

「浮動小数点数」で検索すれば説明が色々と出てくると思いますが…。 誤差が生じる原因は計算機が扱う浮動小数点数の長さが有限なためです。浮動小数点数のビット長をいくらでも長くできれば誤差はいくらでも小さくできます。 算盤で割り算をすることを考えてみてください。算盤は十進です。どこかに小数点の位置があるはずです。そして1/3を計算してみてください。答えは0.3333…になりますが、算盤の駒の列が有限なので途中で計算できなくなります。そこで算盤の横に別の算盤を置けばさらに計算が続けられますがそれでも途中で計算が続けられなくなります。更にその横に別の算盤を置いて… としていけばいくらでも正確な値が求められます。 でも算盤でも、計算機の中の浮動小数点数でも、無限に長い形式は扱えないので途中で計算を打ち切ることになります。そこで誤差が発生します。 計算機の浮動小数点数は常に誤差を含むわけではありません。0.5、0.25、0.125といった値は誤差がありません。有限のビット数で表現できるからです。

noname#173931
質問者

お礼

お礼が遅れてしまい申しわけありません。 以下のサイトでIEEE754 について見てみました。 http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml 失礼しました e の累乗ではありませんでした。 恐れ入りますがもう少し教えていただきたいのですが・・・ (1) 四則演算において誤差が出るのは、 仮数部で表現しきれない数値をもちいて演算するときである、 小数のときである。 このような理解でよいのでしょうか? (2) それと、上記サイトの後半にある 「入りきらない数の丸め方」の項目の最後にある 「最後の桁の半分より大きいので切り上げる」の説明文というのは 仮数部の最後の桁が1であり、 その次の入りきらないところの最初の桁は1 なので、 これは2進数ではすぐ上位のビットの半分である。 さらに そのあと、1であるビットも続くので (入りきらない部分) は ( 最後の桁の半分 ) より大きい、 ということなのでしょうか? (3) Java で電卓を作っているのですが、小数を入力する際、 小数点ボタンをおしたあと、小数部分を入力していくときには、 変数kがあるとして、 k を 1 ずつデクリメントして 押した数値に 10 の k 乗を かけることになると思うのですが、 コンピュータの内部では 10 の累乗の割り算なのでしょうか? 数字の入力の際には整数を入力するので 誤差は生じないのでしょうか? もしよければ、教えていただけないでしょうか? よろしくお願いします。

すると、全ての回答が全文表示されます。