ログイン新規登録

Qiitaにログインしてダークテーマを使ってみませんか?🌙

ログインするとOSの設定にあわせたテーマカラーを使用できます!

1

 本日は 「浮動小数点数と呼ぶ理由」 について書いてみます (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'(ェ)')_🍜✨

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
  3. ダークテーマを利用できます
ログインすると使える機能について
toKoinX
@toKoinX(toKoinX 初学者応援団 (1人))
Python の入門書を読むために必要な知識の提供を目的に活動しております。つまり, 記事の内容は 「初学者な方」 向けに書いております。また, 今まで Mac しか使用して来ませんでしたが Windows11 を始めました。しかし・・・いろいろと設定が大変なことに気づき, 初学者な方にとって, そんな大変な設定等について, 役立つ内容を書いていきたいと思っております。
この記事は以下の記事からリンクされています

コメント

shiracamus
@shiracamus(しらかみゅ)
(編集済み)

ちなみに、 浮動小数点数型には単精度浮動小数点数型式(32bitデータ)や倍精度浮動小数点数型式 (64bitデータ) などがあります。

Pythonのfloatは倍精度 (64bit) です。他の言語ではfloat型は単精度 (32bit)、double型が倍精度 (64bit) だったりします。
64bit (8バイト) とはいっても、Pythonの値はオブジェクト型でクラス情報と被参照数を含むため、実際のデータサイズは24バイトです。

>>> 3.14.__sizeof__()
24
>>> 99999999999999999999999999999999999999999999.99.__sizeof__()
24
>>> 0.000000000000000000000000000000000000000000001.__sizeof__()
24
>>> help(3.14.__sizeof__)
Help on built-in function __sizeof__:

__sizeof__() method of builtins.float instance
    Size of object in memory, in bytes.
1
toKoinX
@toKoinX(toKoinX 初学者応援団 (1人))
(編集済み)

@shiracamus (しらかみゅ) さま

 おはようございます, 大変勉強になります (o'(ェ)')_🍵✨

 C言語を勉強したときに, なんでこんなに「データ型」が, あるんだろうと, 凹みながら勉強していましたが, Python の場合は float 型が, 倍精度(64bit) 等, 改めて, 便利さを感じております ✨ 

 また, float 型オブジェクトの, 実際のデータサイズが, 数値の大小に関わらず「固定」 かつ「24バイト」であることなど, 初学者な方への説明の難しさも, 改めて感じております・・・🍙

0
shiracamus
@shiracamus(しらかみゅ)
(編集済み)

脱線しますが、C言語だとint型は固定長サイズ(32bitあるいは64bit)ですが、Pythonは可変長サイズで値の上限がないです。

>>> 0 .__sizeof__()  # 小数点に扱われないようにドットの前に空白
28
>>> 99999999999999999999 . __sizeof__()
36
>>> 99999999999999999999999999999999999999999999999999 .__sizeof__()
48
>>> 99999999999999999999999999999999999999999999999999 .bit_length()
167
1

 大変わかりやすく説明いただいて, ありがとうございます (o'(ェ)')_🍵✨

言語(目的)によって, 固定長サイズのような制限があったり, 可変長サイズで値の上限がなかったりと (おおお✨), 今になって, 言語の仕様に, おもしろさを感じております✨

0
fujitanozomu
@fujitanozomu(藤田 望)

【浮動小数点数について】

 小数点以下の桁数が, 数値に応じて 「変動(浮動)」 できることが 「浮動小数点数の特徴」 です(同じ意味ですが, 小数点の位置が数値に応じて変動するという言い方もされます)。言い換えてみますと 「小数点以下の桁数において変動可能」 ということです。

浮動小数点数は××で数値を表す形式であり、大きな数値を表す場合には小数点の位置より上に下駄を履かせることになります。小数点以下の桁数が変動するという説明は正しくないと思います。

0
toKoinX
@toKoinX(toKoinX 初学者応援団 (1人))
(編集済み)

@fujitanozomu
 
 コメントを, ありがとうございます。以下が, 自分の説明の根拠です。お読みください。また, この説明根拠においても 「説明が正しくない」 と感じるときは 「ご教授」 を, お願いいたします。

 浮動小数点数の特徴として 「小数点以下の桁数が変動する」 という表現は 「数値の大きさに応じて小数点の位置が変動し, それに伴い実質的な精度が変わる」 という意味です。

 浮動小数点数の表現方法は, おっしゃる通り 「符号・指数部・仮数部」 の三要素で構成され, この仕組みにより, 浮動小数点数は非常に広い範囲の数値を表現できる一方, その精度 「特に小数点以下の桁数」 は, 数値の大きさに応じて 「変動」 します。

 具体的には, 浮動小数点数の指数部は, 数値の大きさに応じて 「小数点の位置を動かす役割」 を果たします。例えば, 指数部が大きくなると, 仮数部で表現される数値の小数点が右に移動し, より大きな数値を表現できます。一方, 指数部が小さくなると, 小数点は左に移動し, より小さな数値を表現します。この過程において, 仮数部の桁数 (特に小数点以下) は, 実質的に 「変動」 します。なぜなら, 同じ桁数の仮数部を持つ浮動小数点数が, 異なる大きさの数値を表現する場合 「精度:小数点以下の桁数」 が変化するからです。

 上記が, 説明根拠ですが, この説明を 「初学者な方:場合によっては, 小学生を含みます」 に, したところで, 理解を得るどころか, 勉強のモチーベーションを下げる契機にすら成ってしまうかもしれません。故に The Zen of Python にある通り Simple is better than complex. の立場をとっています。

0
fujitanozomu
@fujitanozomu(藤田 望)

小学生含む初学者を対象としたとして「Pythonでは少数を「浮動小数点数」で表します。「浮動小数点数」とは、広い範囲(4.9406564584124654×103241.7976931348623157×10308)の値を15~16桁程度の精度で表せられる形式です。」くらいの説明で十分ではないですか?

Pythonで小数を浮動小数点数で表すのとは関係ない固定小数点数の説明や、浮動小数点数について「小数点以下の桁数において変動可能」のような嘘を説明する意図はサッパリわかりませんし不要なものだと思います。

0

@fujitanozomu

 「小数点以下の桁数が変動可能」という表現は 「浮動小数点数の動作原理を簡潔に説明」 したものです。浮動小数点数では, 数値の大きさに応じて小数点の位置が変わるため, 小数点以下の桁数 (つまり精度) は, 実質的に変化します。例えば, 非常に小さな数値と非常に大きな数値では, それぞれ表現できる小数点以下の桁数が異なります (この点を理解できていますか?)。これは, 固定小数点数と比較することで理解が深まります。固定小数点数では, 小数点以下の桁数は常に同じですが, 浮動小数点数ではこの桁数は 「浮動」 するため, 表現できる数値の範囲が広がります。

 上記ように, 初学者に対して, 浮動小数点数の基本的な概念だけでなく, その背後にある 「動作原理を説明」 することは, プログラミングを, より深く理解するために有効だと考えております。

0
fujitanozomu
@fujitanozomu(藤田 望)

Pythonで1010310293の範囲の値をfloatで計算し出力します。

for i in range(-10, 30):
    print(f'{10.0**i / 3:60.30f}')
実行結果
                            0.000000000033333333333333334548
                            0.000000000333333333333333371327
                            0.000000003333333333333333403075
                            0.000000033333333333333334030752
                            0.000000333333333333333300602851
                            0.000003333333333333333747182338
                            0.000033333333333333334930724534
                            0.000333333333333333322202191029
                            0.003333333333333333547282562037
                            0.033333333333333332870740406406
                            0.333333333333333314829616256247
                            3.333333333333333481363069950021
                           33.333333333333335701809119200334
                          333.333333333333314385527046397328
                         3333.333333333333484915783628821373
                        33333.333333333335758652538061141968
                       333333.333333333313930779695510864258
                      3333333.333333333488553762435913085938
                     33333333.333333332091569900512695312500
                    333333333.333333313465118408203125000000
                   3333333333.333333492279052734375000000000
                  33333333333.333332061767578125000000000000
                 333333333333.333312988281250000000000000000
                3333333333333.333496093750000000000000000000
               33333333333333.332031250000000000000000000000
              333333333333333.312500000000000000000000000000
             3333333333333333.500000000000000000000000000000
            33333333333333332.000000000000000000000000000000
           333333333333333312.000000000000000000000000000000
          3333333333333333504.000000000000000000000000000000
         33333333333333331968.000000000000000000000000000000
        333333333333333311488.000000000000000000000000000000
       3333333333333333508096.000000000000000000000000000000
      33333333333333336129536.000000000000000000000000000000
     333333333333333327740928.000000000000000000000000000000
    3333333333333333814280192.000000000000000000000000000000
   33333333333333334921576448.000000000000000000000000000000
  333333333333333314856026112.000000000000000000000000000000
 3333333333333333011121307648.000000000000000000000000000000
33333333333333329011701448704.000000000000000000000000000000

10のべき乗の値を3で割ると数学的には3が無限に並ぶこととなりますがPythonのfloatの精度は有限なので無限に3が並ぶことはありません。各行の3が並んでいるところがfloatとして正確に表せられた範囲ということになります。数値の大小にかかわらず15~16桁の精度があることが確認できます。これはIEEE 754binary64の仕様の十進換算桁数とも合致します。

大きい値については小数点より大きい桁で精度が保証できなくなるので、

「小数点以下の桁数が変動可能」

は浮動小数点数の説明として正しくないですよ。

0

@fujitanozomu

 今日は, もう寝ますが, 上記の例は, 単に f-string を使用して「数値の表示形式を加工」したに過ぎません。これは, 浮動小数点数の実際の精度や表現方法を直接反映している訳ではありません。完全に, 解釈違いです。f-string によるものです。

 補足しますと f-string のフォーマット指定子 :60.30f は, 単に出力される数値を 「60文字幅, 小数点以下30桁の浮動小数点数として表示」 するためのものです。これは, 文字通り ( f は format の略) 「表示上の調整:表示を加工した結果」で在り, 数値の内部的な表現や計算精度には影響していません。

 実際の浮動小数点数の精度は, 数値の大きさに応じて変化することが特徴です。この変動は, 浮動小数点数が仮数部と指数部を使って数値を表現する仕組みによるものです。数値が大きくなるにつれて, 仮数部で表現できる有効数字の桁数が減少し, その結果として小数点以下の桁数も変動します。

 結果として 「小数点以下の桁数が変動可能」 という表現は, 浮動小数点数の特性を正しく反映しており, 間違っているわけではありません。補足しますと, この表現は, 数値の大きさに応じて小数点の位置を調整し, 固定された桁数の精度内で広い範囲の数値を表現するという浮動小数点数の基本的な動作原理を意味しています。

0
fujitanozomu
@fujitanozomu(藤田 望)

 今日は, もう寝ますが, 上記の例は, 単に f-string を使用して「数値の表示形式を加工」したに過ぎません。これは, 浮動小数点数の実際の精度や表現方法を直接反映している訳ではありません。完全に, 解釈違いです。f-string によるものです。

 補足しますと f-string のフォーマット指定子 :60.30f は, 単に出力される数値を 「60文字幅, 小数点以下30桁の浮動小数点数として表示」 するためのものです。これは, 文字通り ( f は format の略) 「表示上の調整:表示を加工した結果」で在り, 数値の内部的な表現や計算精度には影響していません。

 実際の浮動小数点数の精度は, 数値の大きさに応じて変化することが特徴です。この変動は, 浮動小数点数が仮数部と指数部を使って数値を表現する仕組みによるものです。数値が大きくなるにつれて, 仮数部で表現できる有効数字の桁数が減少し, その結果として小数点以下の桁数も変動します。

 結果として 「小数点以下の桁数が変動可能」 という表現は, 浮動小数点数の特性を正しく反映しており, 間違っているわけではありません。補足しますと, この表現は, 数値の大きさに応じて小数点の位置を調整し, 固定された桁数の精度内で広い範囲の数値を表現するという浮動小数点数の基本的な動作原理を意味しています。

@toKoinXさんがよく分かってない方であることは分かりました。

0
toKoinX
@toKoinX(toKoinX 初学者応援団 (1人))
(編集済み)

@fujitanozomu

 f-string による 「形式の内容」 と, 実際の 「精度の違い」 に, 気付いていただけたようで, 嬉しく思います。説明し続けた甲斐があります。お疲れさまでした。

0

いいね以上の気持ちはコメントで

記事投稿キャンペーン開催中
記事投稿キャンペーン 「2024年!初アウトプットをしよう」
~
1