本日は 「割り算の答え」 が, 浮動小数点数で返る理由を書いてみます (o'(ェ)')_🐍
【 CPU の中身について】
CPU という 「計算処理を行う部分」 において, その中身は, おおまかに ALU (整数を処理) と FPU (小数を処理) に, わかれています 🖥
【 ALU の特徴について】
ALU は 「小数の計算」 が, できません。
Python においては // (ダブル・スラッシュ) を使用しますと ALU により 「割り算」 が, 行われますが 「整数」 しか返せないので 「商と余り」 という 「かたち」 で計算し 「商」 のみが 「答え」 として, 返る仕組みに成っています。また 「余り」 を計算したいときは % (パーセント記号) を, 別途使用して計算します。
#ALU:商の求め方
quotient = 10 // 3
print(quotient) # 計算結果 3
#ALU:余りの求め方
remainder = 10 % 3
print(remainder) # 計算結果 1
【 FPU の特徴について】
FPU は 「整数の計算」 が, できません。
Python においては / (スラッシュ) を使用しますと FPU により 「割り算」 が, 行われますが 「小数」 しか返せないので 「小数」 で 「答え」 が, 返る仕組みに成っています。
#FPU:商の求め方
result = 10 / 3
print(result) # 計算結果 3.333...
【整数と小数(浮動小数点数)の計算について】
「整数と小数の計算」 においては 「整数が小数に変換」 されてから FPU で, 計算されます。ですので, その 「答え」 も 「小数」 で, 返ります。
#整数と小数の計算
result = 1 + 1.0
print(result) # 計算結果 2.0
【補足】
以前は amazon のコメントにおいて 「お返事」 が, できたのですが, その 「お返事機能」 が, なくなってしまったため, よくある 「疑問/質問」 などについても Qiita 様々において, 書いていこうと思っております ✨
また, この内容については, ぼくが書いている本で恐縮ですが, 4歩めのテキストの 「コラム - ALU と FPU について」 にて 「図入りでもう少し詳しく解説」 しております。もし, ご興味ありましたら, 何卒, よろしくお願いいたします (o'(ェ)')_🍵✨
* はじめてのプログラミング Python 入門者になるための4歩
コメント@fujitanozomu(藤田 望) 0 @fujitanozomu(藤田 望) 0 @toKoinX(toKoinX 初学者応援団 (1人))(編集済み) 0 @toKoinX(toKoinX 初学者応援団 (1人))(編集済み) 0 @fujitanozomu(藤田 望)
0 @toKoinX(toKoinX 初学者応援団 (1人))(編集済み) 0 @fujitanozomu(藤田 望) 0 @toKoinX(toKoinX 初学者応援団 (1人)) 0
FPUがなくとも浮動小数点演算は可能なので説明として筋が悪いと思います。
あと、Pythonが扱える整数型はALUが直接扱えるものと直接扱えない多倍長整数とで区別がないので整数演算をALUを持ち出して説明するのも筋が悪い気がしますね。
@fujitanozomu
コメントを, ありがとうございます。以下が, 自分の説明の根拠です。お読みください。また, この説明根拠においても 「筋が悪い」 と感じるときは 「ご教授」 を, お願いいたします。
FPU を使用しない場合は, 浮動小数点数の演算は, ご存知の通り, 以下の方法等で実行できます。
① ソフトウェアエミュレーションを使用する
つまり CPUの 一般的な命令を使用して, 浮動小数点演算を 「エミュレート」 します。但し, このプロセスは FPU を使用する場合よりも 「遅くなります」 が 「正確な計算結果を得る」 ことができます。
② 固定小数点演算を使用する
つまり 浮動小数点数ではなく, 固定小数点数を使用して演算を行う方法です。これは, 浮動小数点演算よりも計算が単純で, 特にFPU がない環境では有効です。但し, 固定小数点数は, 浮動小数点数に比べて, 表現できる 「数値の範囲」 や 「精度」 が限られています。
最後に, 浮動小数点数のソフトウェアエミュレーションは, 特に 「リソースが限られた組み込みシステム」 や 「古いコンピューターで使用」 されることが多いです。 「現代の多くのプロセッサ」 には FPU が組み込まれており「 FPU がない環境でも浮動小数点演算は可能」 ですが 「初学者を対象とした説明」 においては, FPU の存在すら知らない方も, いらっしゃいますので, まず 「 FPU の説明からしてあげる」 ことが, 親切だと考えております。
もう1つコメントをいただいていたことに気づきました, 以下が, 自分の説明の根拠です。お読みください。また, この説明根拠においても 「筋が悪い」 と感じるときは 「ご教授」 を, お願いいたします。
まず, 自分の立場においてですが, 前提知識のあまりない 「初学者な方」 を対象としています。
それでは, まず ALU については, 基本的な算術演算と論理演算を担当するプロセッサの重要部分で在り, 整数演算において, 中心的な役割を果たしています。
Python における整数演算は, 実際に ALU の能力を反映しています。Pythonの // 演算子は整数除算を行い, これは ALU が実行する基本的な演算の一つです。この演算においては, 小数部分は切り捨てられ, 結果として, 整数のみが返されます。これは ALU が, 浮動小数点数等を直接処理しないという特性に基づいています。
また, 多倍長整数に関しては, これは, 内部的には複数の ALU 操作を組み合わせることで処理されます。ALU は基本的な整数演算の単位を提供し, 多倍長の整数演算はこれらの基本演算を組み合わせて実現されます。これは ALU の機能の柔軟性を示しており Python の整数演算が ALU に依存している, と理解できます。
それから % 演算子については, これは, 余りを求める演算で在り, これもまた, 整数演算の一環として ALU によって処理されます。このように Python における整数演算は ALU の機能と密接に関連してます。
上記が, 説明根拠ですが, この説明を 「初学者な方:場合によっては, 小学生を含みます」 に, したところで, 理解を得るどころか, 勉強のモチーベーションを下げる契機にすら成ってしまうかもしれません。故に The Zen of Python にある通り Simple is better than complex. の立場をとっています。
Pythonの組み込み型である
float
やint
の値を/
で除算した結果はfloat
となります。これはPythonの仕様によるものです。Pythonの仕様はFPUやALUとは関係あるものではありません。計算機のどのような機能を使用して使用を実現するかというのは実装レベルの話となります。
この記事の想定している読者が初学者ということであれば読者が求めている答もPythonの実装に関するものではないと思いますがいかがでしょうか、
@fujitanozomu
Python の仕様や挙動を学ぶ際には, その背景にある 「コンピュータの基本原理についての理解も重要」 だと考えております。特に, 初学者にとっては、Python の演算子が 「なぜ」 そのように動作するのかという 「理由」 を知ることが, 理解に役立ちます。実際に, 初学者の方から 「なぜ, 四則演算において / 演算子を使用したときだけ, 小数になるのか?」 という質問をいただきましたが, その返事が, もし, おっしゃる通りに 「 Python の仕様によるものです」 だけで, 納得していただけるとは, 思っておりません。
Python における / 演算子が float 型の結果を返す仕様は, これも, おっしゃる通り Python の言語設計に基づいていますが, その背後には ALU や FPU のようなハードウェアの機能が影響を与えています。
故に Python の演算子の動作を説明する際には 「言語の仕様においてだけでなく」 それを支える 「コンピュータの基本的な概念」 についても学ぶことが, 初学者にとって, より理解に繋がると考えています。
最後に 「読者が求めている答もPythonの実装に関するものではないと思いますがいかがでしょうか」 についての返答ですが, これにおいては, 完全に 「その人によります」。「実装に関する知識を求める者」 は 「実装に関する記事」 を探し読み, また 「原理を知りたい者」 は 「原理に関する記事」 を探し, 読むのではないかと思っております。
記事の説明では
10 // 3
の除算をされていますが、除算で扱う値がプロセッサの除算命令で可能な程度小さく、除算器が使用できるプロセッサであれば、Pythonの実装によってはALUではなく除算器を使用する可能性もあると思いますがそういった説明が初学者に対して誤解なく可能と思われますか? (この記事ではALUが使われると断言されてますが)計算機のアーキテクチャに関する説明は理系の大学の授業でもある程度のコマ数を要して説明するものと思いますがそういう勉強をされたい方に対しては適切な書籍なり学校なりを案内するのがまあできるところなのではないかと思っています。
また、Python等高級言語は現実のハードウェアを抽象化し意識しないで使用できるよう意図されたものであり、整数の除算がプロセッサのどこの機能を利用して行われるかという話は枝葉末節なものです。Pythonを学びたいという人のニーズの答えがその説明にある気もしないですね。
@fujitanozomu
コメントの内容が, 支離滅裂です。論点から, かなりズレています。これ以上は 「無駄な応酬」 であると, 判断させて頂きます。楽しい時間を, ありがとうございました。
いいね以上の気持ちはコメントで