本日は 「浮動小数点数と呼ぶ理由」 について書いてみます (o'(ェ)')🍙
【浮動小数点数と固定小数点数について】
Python 初学者な方において 「小数」 のことを, わざわざ 「浮動小数点数」 と呼んでいるのは 「なぜ」 だろう・・・と思われている方が, 多いと感じております。
コンピュータにおける 「小数の表現方法」 には 「浮動小数点数と固定小数点数」 の 「2つの表現方法」 があります。このうち Python においては 「浮動小数点数」 を使用する仕組みに成っていますので, 単に 「小数」 とは言わずに, 厳密に 「浮動小数点数」 と, 呼んでおります。
【浮動小数点数について】
浮動小数点数は, 英語で Floating Point Numbers と言います。その直訳的な日本語が 「浮動小数点数」 な訳ですが 「感覚」 としましては 「変動小数点数」 のようなイメージです。つまり, 小数点以下の桁数が, 数値に応じて 「変動(浮動)」 できることが 「浮動小数点数の特徴」 です(同じ意味ですが, 小数点の位置が数値に応じて変動するという言い方もされます)。言い換えてみますと 「小数点以下の桁数において変動可能」 ということです。
① 浮動小数点数型データについて
基本的に 「小数点」 を使用しますと 「浮動小数点数」 として, つまり float 型として, 使用できます。その他 / (スラッシュ:除算演算子) を使用した場合等においても float 型として処理されます。その理由については, 以下を参考にしていただけると, 嬉しく思います。
② 実際に確認してみましょう
type() 関数を使用してみますと, データ型が float 型であることを確認できます。
#代入と型の確認
x = 1.
print(type(x))
#実行結果
<class'float'>
【固定小数点数について】
固定小数点数は, 英語で Fixed Point Numbers と言います。小数点以下の桁数が 「固定」 していることが 「固定小数点数の特徴」 です。言い換えてみますと 「小数点以下の桁数において変動不能(固定)」 ということです。この 「変動可能や変動不能(固定)」 の詳細においては, 精度の話や, メモリ効率の話や, 表現範囲の話についての利点等によるもので, 少しマニアックで難しい内容になるため, 今回においては, 割愛させていただきます。
① 固定小数点数型データについて
Python においては 「固定小数点数型データ」 という 「データ型」 は, 用意されておりません。以上になります。
但し, ライブラリの中に在る decimal モジュールの Decimal クラスを使用しますと 「固定小数点数の計算に近い方法」 で, 処理(10進小数処理)をすることが可能なようです。ぼくの記事は 「初学者な方を応援することを目的」 としておりますが, 初学者以上な方(中級者な方/上級者な方)にも読んでいただけているようですので, decimal モジュールにおいては, 以下に詳細がございます。
本日も, 最後まで読んでいただき, ありがとうございました (o'(ェ)')_🍜✨
コメント
@shiracamus(しらかみゅ)(編集済み)
1 
@toKoinX(toKoinX 初学者応援団 (1人))(編集済み) 0 
@shiracamus(しらかみゅ)(編集済み)
1 
@toKoinX(toKoinX 初学者応援団 (1人))0 
@fujitanozomu(藤田 望)
0 
@toKoinX(toKoinX 初学者応援団 (1人))(編集済み) 0 
@fujitanozomu(藤田 望)0 
@toKoinX(toKoinX 初学者応援団 (1人))0 
@fujitanozomu(藤田 望)
実行結果
のべき乗の値を で割ると数学的には が無限に並ぶこととなりますがPythonの が並ぶことはありません。各行の が並んでいるところが
0 
@toKoinX(toKoinX 初学者応援団 (1人))0 
@fujitanozomu(藤田 望)
0 
@toKoinX(toKoinX 初学者応援団 (1人))(編集済み) 0
ちなみに、 浮動小数点数型には単精度浮動小数点数型式(32bitデータ)や倍精度浮動小数点数型式 (64bitデータ) などがあります。
Pythonのfloatは倍精度 (64bit) です。他の言語ではfloat型は単精度 (32bit)、double型が倍精度 (64bit) だったりします。
64bit (8バイト) とはいっても、Pythonの値はオブジェクト型でクラス情報と被参照数を含むため、実際のデータサイズは24バイトです。
@shiracamus (しらかみゅ) さま
おはようございます, 大変勉強になります (o'(ェ)')_🍵✨
C言語を勉強したときに, なんでこんなに「データ型」が, あるんだろうと, 凹みながら勉強していましたが, Python の場合は float 型が, 倍精度(64bit) 等, 改めて, 便利さを感じております ✨
また, float 型オブジェクトの, 実際のデータサイズが, 数値の大小に関わらず「固定」 かつ「24バイト」であることなど, 初学者な方への説明の難しさも, 改めて感じております・・・🍙
脱線しますが、C言語だとint型は固定長サイズ(32bitあるいは64bit)ですが、Pythonは可変長サイズで値の上限がないです。
大変わかりやすく説明いただいて, ありがとうございます (o'(ェ)')_🍵✨
言語(目的)によって, 固定長サイズのような制限があったり, 可変長サイズで値の上限がなかったりと (おおお✨), 今になって, 言語の仕様に, おもしろさを感じております✨
浮動小数点数は符 号 仮 数 基 数 指 数 で数値を表す形式であり、大きな数値を表す場合には小数点の位置より上に下駄を履かせることになります。小数点以下の桁数が変動するという説明は正しくないと思います。
@fujitanozomu
コメントを, ありがとうございます。以下が, 自分の説明の根拠です。お読みください。また, この説明根拠においても 「説明が正しくない」 と感じるときは 「ご教授」 を, お願いいたします。
浮動小数点数の特徴として 「小数点以下の桁数が変動する」 という表現は 「数値の大きさに応じて小数点の位置が変動し, それに伴い実質的な精度が変わる」 という意味です。
浮動小数点数の表現方法は, おっしゃる通り 「符号・指数部・仮数部」 の三要素で構成され, この仕組みにより, 浮動小数点数は非常に広い範囲の数値を表現できる一方, その精度 「特に小数点以下の桁数」 は, 数値の大きさに応じて 「変動」 します。
具体的には, 浮動小数点数の指数部は, 数値の大きさに応じて 「小数点の位置を動かす役割」 を果たします。例えば, 指数部が大きくなると, 仮数部で表現される数値の小数点が右に移動し, より大きな数値を表現できます。一方, 指数部が小さくなると, 小数点は左に移動し, より小さな数値を表現します。この過程において, 仮数部の桁数 (特に小数点以下) は, 実質的に 「変動」 します。なぜなら, 同じ桁数の仮数部を持つ浮動小数点数が, 異なる大きさの数値を表現する場合 「精度:小数点以下の桁数」 が変化するからです。
上記が, 説明根拠ですが, この説明を 「初学者な方:場合によっては, 小学生を含みます」 に, したところで, 理解を得るどころか, 勉強のモチーベーションを下げる契機にすら成ってしまうかもしれません。故に The Zen of Python にある通り Simple is better than complex. の立場をとっています。
小学生含む初学者を対象としたとして「Pythonでは少数を「浮動小数点数」で表します。「浮動小数点数」とは、広い範囲(~ )の値を15~16桁程度の精度で表せられる形式です。」くらいの説明で十分ではないですか?
Pythonで小数を浮動小数点数で表すのとは関係ない固定小数点数の説明や、浮動小数点数について「小数点以下の桁数において変動可能」のような嘘を説明する意図はサッパリわかりませんし不要なものだと思います。
@fujitanozomu
「小数点以下の桁数が変動可能」という表現は 「浮動小数点数の動作原理を簡潔に説明」 したものです。浮動小数点数では, 数値の大きさに応じて小数点の位置が変わるため, 小数点以下の桁数 (つまり精度) は, 実質的に変化します。例えば, 非常に小さな数値と非常に大きな数値では, それぞれ表現できる小数点以下の桁数が異なります (この点を理解できていますか?)。これは, 固定小数点数と比較することで理解が深まります。固定小数点数では, 小数点以下の桁数は常に同じですが, 浮動小数点数ではこの桁数は 「浮動」 するため, 表現できる数値の範囲が広がります。
上記ように, 初学者に対して, 浮動小数点数の基本的な概念だけでなく, その背後にある 「動作原理を説明」 することは, プログラミングを, より深く理解するために有効だと考えております。
Pythonで~ の範囲の値を
float
で計算し出力します。float
の精度は有限なので無限にfloat
として正確に表せられた範囲ということになります。数値の大小にかかわらず15~16桁の精度があることが確認できます。これはIEEE 754のbinary64
の仕様の十進換算桁数とも合致します。大きい値については小数点より大きい桁で精度が保証できなくなるので、
は浮動小数点数の説明として正しくないですよ。
@fujitanozomu
今日は, もう寝ますが, 上記の例は, 単に f-string を使用して「数値の表示形式を加工」したに過ぎません。これは, 浮動小数点数の実際の精度や表現方法を直接反映している訳ではありません。完全に, 解釈違いです。f-string によるものです。
補足しますと f-string のフォーマット指定子 :60.30f は, 単に出力される数値を 「60文字幅, 小数点以下30桁の浮動小数点数として表示」 するためのものです。これは, 文字通り ( f は format の略) 「表示上の調整:表示を加工した結果」で在り, 数値の内部的な表現や計算精度には影響していません。
実際の浮動小数点数の精度は, 数値の大きさに応じて変化することが特徴です。この変動は, 浮動小数点数が仮数部と指数部を使って数値を表現する仕組みによるものです。数値が大きくなるにつれて, 仮数部で表現できる有効数字の桁数が減少し, その結果として小数点以下の桁数も変動します。
結果として 「小数点以下の桁数が変動可能」 という表現は, 浮動小数点数の特性を正しく反映しており, 間違っているわけではありません。補足しますと, この表現は, 数値の大きさに応じて小数点の位置を調整し, 固定された桁数の精度内で広い範囲の数値を表現するという浮動小数点数の基本的な動作原理を意味しています。
@toKoinXさんがよく分かってない方であることは分かりました。
@fujitanozomu
f-string による 「形式の内容」 と, 実際の 「精度の違い」 に, 気付いていただけたようで, 嬉しく思います。説明し続けた甲斐があります。お疲れさまでした。
いいね以上の気持ちはコメントで