pythonの乗算の表示結果の差について教えてください

このQ&Aのポイント
  • pythonの乗算を行った結果、異なる結果が出る理由について質問しています。
  • 参考書では、上の計算結果は最大精度で表示しているが、下の計算結果は人間が見るための精度で表示していると説明されています。
  • 質問者は、最大精度で表示しているにもかかわらず、結果が違うことに疑問を持っており、なぜバグではないのか理解できないと述べています。
回答を見る
  • ベストアンサー

pythonの乗算の表示結果の差について教えてください

pythonの乗算の表示結果の差について教えてください。 pythonの対話モードで下記に示す乗算を行いました。 同じ計算をしているにもかかわらず、結果が異なる理由を教えてください。 参考書によると上の計算表示結果は最大精度で表示しているから、下の計算結果表示は人間が見るための精度で表示しておりバグではない。と、書いていました。最大精度で表示(6.2830000000000000なら理解ができます)しているにもかかわらず、計算結果が違うことがなぜバグではないのか理解ができません。 教えてください。 ※上の結果がおかしい理由は2進数の計算の問題だとは思いますが・・・ ------------------------------------------ >>> 3.1415 * 2 6.2830000000000004 >>> print 3.1415 * 2 6.283 ------------------------------------------

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> >>> 3.1415 > 3.1415000000000002 > 回答ありがとうございます。しかし、↑この時点で納得ができないのですが・・・ これは、 1) ユーザーは 3.1415 というのを「文字列」で入力しています。 、 2) それを内部表現(2が基数の浮動小数点数)に変換します。 しかしこのとき 3.1415 を正確に表現できないので「丸め」がおきます。 このため、Pythonにとっては 3.1415000000000002 のようになってしまうのです。 3) 内部表現を再度「文字列」に変換して出力するのですが、 上記の説明のとおり、入力時に数値が「丸められて」いるので 出力もそれにしたがってしまっているわけです。 入力がたとえば 3.125 とかなら内部表現に変換するときに正確に 行えるので、このようなことはおきません。 といった説明でいかがでしょうか?

aakkiirraajp
質問者

お礼

納得しました。 ありがとうございました。 バグではなく仕様で、さらに人間がわかるように丸め誤差で表示しているということですね。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

print 3.1415*2 としたときは、表示のときに下位の桁が省略されているだけで、 内部的な値は 3.1415*2 とだけやったときと同じです。 ですからバグでないというように書いてあるのでしょう。 >>> 3.1415 3.1415000000000002 >>> 3.1415 * 2 6.2830000000000004 >>> x = 3.1415 * 2 >>> x 6.2830000000000004 >>> print x 6.283 >>> print "%20.16f" % x 6.2830000000000004 >>> 3.1415 と入力したのに 3.1415000000000002 が出力されているとか 3.1415 * 2 が 6.2830 ではなく 6.2830000000000004 となっているのは >※上の結果がおかしい理由は2進数の計算の問題だとは思いますが・・・ ということです。

aakkiirraajp
質問者

お礼

>>> 3.1415 3.1415000000000002 回答ありがとうございます。しかし、↑この時点で納得ができないのですが・・・ なんで、値が勝手に書き換えられてしまうのか、よくわかりません??? すみません。細かくて

関連するQ&A

  • ターミナルにおけるPythonスクリプトの実行方法

    ターミナルにおいて、Pythonで書いたスクリプトを実行したいです。 手始めに、有名な print"Hello,World"を試してみました。対話型では成功したのですが、 「python プログラム名」の方法では失敗してしまいます。 そのとき、「syntax error」と表示されてしまいます。 全くの素人のため、自分で調べてもさっぱり分かりませんでした。 どうしたらスクリプトを正しく実行することができるのか、教えてください。よろしくお願いします。 環境:imac,mac osx

    • 締切済み
    • Mac
  • pythonの文字コードについて

    pythonの各文字コードにおける日本語の扱われ方について分からないことがあります。 日本語1文字の長さはユニコード文字列では1、8ビット文字列では3という説明が参考書には書いてありました。しかし、実際に実行してみると私の環境では結果が異なりました。さらに文字化けまで起きてしまいました。なぜなのでしょうか?回答お願いいたします。 windowsを使用しており、バージョンはpython2.7です。 以下、私の環境下での実行結果です。 >>> ustr=u"あいうえお" >>> len(ustr) 10 >>> len(ustr.encode("utf-8")) 20 >>> print ustr ‚ ‚¢‚¤‚¦‚¨ >>> print ustr.encode("utf-8") ツつツつ「ツつ、ツつヲツつィ >>> ustr2="あいうえお" >>> len(ustr2) 10 >>> print ustr2 あいうえお

  • python ver3について

    python3を勉強している初心者です。 参考書に載っていた、階乗を計算する例題を変更したいと思っています。 このプログラムを書き換えて、input文で任意の数字nをキーボードから入力して、結果を表示させたいんですが、どうすれば良いでしょうか。 このプログラムでは思う様に動きません。 n=input() def fact(n):   if n ==0:     return 1   return n*fact(n-1) print(fact(n)) input() よろしくお願いいたします。

  • python3.3についての質問です

    python3.3についてお聞きいたします。 「すべてのプログラム」-「Python3.3」-「IDLE(Python GUI)」を立ち上げて、 a=[5,6,7] a[0] と入力し「Enter」で、結果が「5」と正常に表示されます。 「IDLE」の一番上の欄の「File」-「New Window」の画面で上記と同じプログラムを入力し、「File」-「Save」で保存してから、「Run」-「Run Module F5」で実行させますと、 >>> ===========RESTART========== >>> >>> と表示されるだけです。 なぜ「5」と表示出来ないんでしょうか。 同じプログラムをメモ帳で書いて、文字コードを「UTF-8」で保存して、走らせても結果は何も表示しません。 なぜなんでしょうか。ご教授お願いいたします。

  • Pythonでプログラミングをしています

    Pythonでプログラミングをしています。 普段はTkinterを中心にいじっているのですが、 ふとおもったのですが、コマンドラインで、Enterキーを押したら処理1,次にEnterキーを押したら処理2....... みたいなことは、どのようにやるのでしょう? たとえば、「2の100乗を計算するとき、1乗から計算結果を、Enterキーを押すごとに表示していく」みたいなものです。

  • pythonの編集仕様のいろいろ

    pythonのプログラミングを少し始めているのですが、以下のような問題に直面しました。一番最初にhello world! を表示するものです。 hello.pyを作ってpython hello.py とすると実行するようです。 hello.pyの内容ですが、あるサイト(以下の画像)では、 print "Hello, Wordl!" とありますが、私の環境では動かず、さらにサイトを検索して、 print ( "Hello, Wordl!" ) が正しいとのことで、こちらは問題なく動作しました。 また、このprintコマンドですが、編集画面で左詰めでないとダメで、コマンドの前の空白(インデント)があったら正しく動作しないとのことです。 このようなささいな違い、またプログラム編集上の作法の問題とかを見ると、この言語の習得は難しいように感じてしまいます。アルゴリズムの完全性とか、文法上の問題が完全にクリアになってもなぜが動作しない、という問題に直面しそうなのですが。自分の知らない何かのしきたりに違反しているという状態で、しかもそれが本質的でないように見える言語仕様(先のインデントがダメという問題)というのであれば、後からいろいろ出てきそうなのですが。例えば、”コマンドは第一文字が大文字でなければならない”とかです。数百、数千行のコードを書いたりすると、間違いの可能性のあるところが目に見えないところにいっぱいという感じがするのですが。バグフィックスというのは絶対に絶対に間違いない、と断言してそれでいてうっかりミスが見つかるわけです。”間違っているかもしれないな”じゃバグフィックスできません。 それでいて割と巷間ではpython人気という感じがしているのですが。 pythonのどこがいい、ということなのでしょうか。私が考えている困難を補う効用があるのでしょうか。 私の環境はanaconda 3.5です。バージョン毎にかなり違うのでしょうか。

  • pythonファイルの文字化け

    MAMPを通じて以下のpythonファイルをchromeで表示したのですが、日本語の部分が文字化けしてしまいます。 #!C:/MAMP/bin/python/bin/python #coding:utf-8 print "content-type: text/html" print "" print "こんにちは" 全面的に参考にしたudemyのサイトで解決法を質問したのですが、 「Chromeの言語判定が空振りしているようなので、 <html lang="ja"> とhtmlタグのlang属性を追加して再読み込みしてみてください。」 と言われました。 しかし、pyファイルのどこにこのhtmlタグを入れるのか理解できません。 chromeのデベロッパーツールでこのタグを追加しても変わりませんでした(そもそも根本的解決になっていません)。 どのようにして解決すれば良いのでしょうか。

  • Python3

    Python3で辞書のループ処理をしています。 以下のコード users = {"yama":200, "kama":300, "att":500} for key, value in users.items(): print("key: %s value: %d" % (key, value)) を実行すると key: att value: 500 key: kama value: 300 key: yama value: 200 key: att value: 500 key: kama value: 300 key: yama value: 200 上記のような結果になってしまいます。 1セットだけ表示させたいのになぜ2セットの表示になってしまうのでしょうか? 教えてください。よろしくお願いします。

  • 計算結果の上限値を設定したい

    計算結果の上限値を設定したいです。 例えば、最大値を3と設定した時、計算結果が3以下の場合はそのままの数値が表示され、3を超えた場合は3と表示される方法はありますか? 例)最大値を3と設定 計算結果2.4→表示2.4 計算結果5.2→表示3 よろしくお願い致します。

  • Python: print fib(0) None

    「Pythonチュートリアル」というO'REILLYの本の33ページ目に、 >>> print fib(0) None を返すように書かれているのですが、実際にはエラーが返ってきます。 本当にNoneが返ってくるべきなのでしょうか? そして、Noneを返すにはどうすればいいのでしょうか? 本はPython 3.1.1を使用しているそうです。 私はPython 3.5.1を使用しています (同じVersionにしましょう、という回答はなしの方向でお願いします)。 実際の結果: In [87]: fib(3) 0 1 1 2 In [88]: fib(0) [空白です] In [89]: print fib(0) File "<ipython-input-89-1cd6a4451e49>", line 1 print fib(0) ^ SyntaxError: invalid syntax 関数fib自体は以下の通りです: In [73]: def fib(n): # フィボナッチ級数をnまで書き出す ....: """nまでのフィボナッチ級数を表示する""" ....: a, b = 0, 1 ....: while a < n: ....: print(a, end=' ') ....: a, b = b, a+b ....: print() ....: In [74]: # では、この関数を呼び出してみよう: In [75]: fib(2000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 ・・・ではお願いします。