【数学苦手筆者が調べてみたシリーズ1】数学苦手な筆者がInt型・Float型・Double型について調べてみた

# 概要
1. 記事の目的
2. 注意事項
3. なぜ調べようと思ったのか
4. そもそも型とは
5. Int型・Float型・Double型の特徴
6. 倍精度浮動小数点数型と浮動小数点数
    1. そもそも浮動小数点数型とはなにか？ 
    2. 浮動小数点数についてまとめると
7. まとめ
8. おわりに
    1. 調べてみた感想 
    2. ChatGTP3.5と4を比較利用した所感と更なる検証
9. 利用したもの一覧
    1. ChatGTP3.5と4
    2. 参考サイト一覧 

# 1.記事の目的

この記事は筆者自身の学習と同時に、筆者と同じくプログラミング初心者かつガチで数学が苦手な方のfloat型・double型に対する理解の一助になればと思い記事にしました。
※計算するようなものは次の記事で出します

今回は上記に＋αとしてChatGTPの3.5と4で同じ質問を通して比較実験し思考の違いを観察してみました。

# 2.注意事項

上記の目的から<font color="Red">**数学が得意な方・型について理解している方には非常に退屈な記事であると思われます**。
</font>

初歩的なことも調べており<font color="orange">筆者と同じように苦手な方でもわかるように書いている</font>ため概要からもわかる通り<font color="Red">結構長いです</font>。

【おわりに】に記載した【ChatGTP3.5と4を比較利用した所感と更なる検証】だけ読むでもいいかもしれません。

# 3.なぜ調べようと思ったのか
結論としては**型についての理解を深めて使い分けができるようになりたい**と考えたためです。

言語問わずプログラミングについて学習しているとint型など様々な型を扱うと思いますが、初学者である私はタイトルにある3つの型について以下のように認識していました。

| 型名 |認識                |使い方                                              |
| :---:| :---:             |:---:                                               |
|int   | 0~9の自然数を扱う型|人数や時間など少数を用いて表現するのに不向きな場合に使う|
|float |小数を扱う型        |利益率や確率など正確な数値を知りたいときに使う         |
|double|小数を扱う型        |利益率や確率など正確な数値を知りたいときに使う         |

ものすごくザックリとしていますが、この認識にとどめほかの学習を進めていきました。

しかし、PF作成などが終わり改めて基礎を復習したら以下2点について疑問が出てきました。
- なぜfloat型とdouble型の2種類があるのか(同じならどっちかで良くない？)
- 使うシーンでも違いがあったりするのか（種類が分かれているくらいだから違うはず）

と考えました。

この疑問を解消して理解を深めるため、昨今話題のChatGTPを利用するいい機会だと思い記事や情報サイトと一緒に使って調べてみました。

# 4.そもそも型とは
 [データ型とは?](https://blog.senseshare.jp/%20data-type.html#:~:text=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E6%89%B1%E3%81%86%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AB,%E3%80%8C%E5%9E%8B%E3%80%8D%E3%81%A8%E8%A8%80%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)

から一部抜粋・編集したところ…
> プログラミングにおける「データ型」とは、「データの種類」のことです。
プログラムの中でデータを扱う際には、そのデータが「どんな種類のものなのか」をあらかじめ指定し、「この変数にはこの種類のデータを格納するよ」ということをあらかじめ指定しておきます。そうすることで、プログラムに正しく計算をさせることが出来ます。

という回答を得られました。果たしてChatGTPたちは何と答えるのか？

#### ChatGTPに聞いてみた1
ChatGTP3.5と4にも「プログラミングにおけるデータ型についてプログラミングしたことがない人にもわかるよう説明してください」と聞いてみたところ以下のような答えが返ってきました。

![スクリーンショット 2023-05-14 154554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/5a777a9b-861a-b2f4-7160-956566747a9c.png "ChatGTP3.5の返答1")

![スクリーンショット 2023-05-14 154608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/61337434-a0a5-a51d-4d9e-f02443b25f65.png "ChatGTP3.5の返答2")

![ChatGTP4の返答1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/59dc076c-1ed0-7885-5732-5ce875b458ab.png "ChatGTP4の返答1")

![ChatGTP4の返答2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/86196898-a6ff-5ca3-9b5e-87d8d4ccf0de.png "ChatGTP4の返答2")

内容としてはサイトと変わらぬ返答が返ってきました。

なるほど、わかりやすく例えると

- データ型は情報を渡す際に使う変数という箱に、名前シールを付けてわかりやすくするもの
- 名前を付けることで扱い方が変わる
- 箱に入れてる種類のもの以外は入れられない

引っ越しする時に段ボールにまとめるイメージならわかりやすいかも。

|変数名    |データ型 |値         |
|:-:      | :-:      |:-:       |
|num1     |int      |1          |
|num2     |float    |0.11・・   |
|段ボール1 |われもの |皿         |
|段ボール2 |書籍  　 |漫画       |
|段ボール3 |衣類     |シャツ     |

# 5.　Int型・Float型・Bouble型の特徴

[int型とは？int型とdouble型の違いやint型変数の宣言と演算の例を紹介！](https://www.fenet.jp/infla/column/technology/int%E5%9E%8B%E3%81%A8%E3%81%AF%EF%BC%9Fint%E5%9E%8B%E3%81%A8double%E5%9E%8B%E3%81%AE%E9%81%95%E3%81%84%E3%82%84int%E5%9E%8B%E5%A4%89%E6%95%B0%E3%81%AE%E5%AE%A3%E8%A8%80%E3%81%A8%E6%BC%94%E7%AE%97/)

[変数「float型」と「double型」の違いとは？メリットとデメリット、用途も元社内SEがわかりやすく解説](https://study-z.net/100190548/2)

から一部抜粋・編集したところ…

|型名     |データサイズ          |デメリット                                           |メリット                                        |
|:-:|:-:|:-:|:-:|
|int      |32ビット（4バイト）   |比較的小さな整数値しか扱えない    　　　　　　　　　　　|処理速度が速い                                  |
|float    |32ビット (4バイト)    |範囲が狭いため精度が低い傾向にある　　　　　　　　　　　|データサイズが小さいためメモリ領域への負担が少ない|
|double   |64ビット (8バイト)    |範囲が広く精度が高い傾向にある（絶対正確！ではない） 　 |データサイズが大きくメモリ領域に負荷がかかる      |

※なお、float型とdouble型の処理速度についてはよくfloat型は処理が速くdouble型は処理が遅いと見かけますが、探していると

[第４章　キャストが好き float型対double型](http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html)

[x86でdoubleがfloatより速いかどうかを検証してみた](https://qiita.com/telmin_orca/items/455dab4a6ffd4545ee95)

などのブログを見つけ、場合によってはfloat型が処理遅い場合があり<font color= "red">絶対的に速いというわけではない</font>ようです。
#### ChatGTPに聞いてみた2
「プログラミングにおいてINT型・FLOAT型・DOUBLE型の特徴をまとめて下さい」とChatGTPに聞いてみたところ…

![スクリーンショット 2023-05-14 163546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/e9552815-6e8a-3848-2dbe-62e2ada140e6.png "ChatGTP3.5の返答")

![スクリーンショット 2023-05-14 163628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/b0a41075-ac00-8aa3-ad8f-7ef6a3c5be00.png "ChatGTP4の返答")

と返答がありました。

ChatGTP4では処理速度について触れなくなりましたね。

処理速度はさておき、使用するメモリ容量についてはまだ意識して開発等行ったことないですが、今後プロジェクトや基幹システム開発などで設計する際に意識する必要が出てくるのかもしれないですね。

# 6. 倍精度浮動小数点数型と浮動小数点数
型について調べていると【倍精度浮動小数点数】という単語が出てきましたが、これが何か調べたら…
[倍精度浮動小数点数型 【double precision floating point number type】](https://e-words.jp/w/%E5%80%8D%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E5%9E%8B.html)より引用

> 倍精度浮動小数点数型とは、プログラミング言語などで用いられる数値データ型の一つで、64ビット長の浮動小数点数を格納することができるもの

と出てきました。

#### ChatGTPに聞いてみた3

ChatGTPたちに「倍精度浮動小数点数について小学生でもわかるように教えてください」と言ってみました。
すると……
![スクリーンショット 2023-05-14 205339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/4ccab345-37fe-988c-a636-2c623fd6faff.png "ChatGTP3.5")

いや、2進数て誰（何）？小学生知らなくない？（私も知らない）

ので次の記事にすることにしました。

それはさておき、4はどうでしょうか？

![スクリーンショット 2023-05-14 205313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/3c2f41de-d22b-acfc-c6b2-8c4af92da149.png "ChatGTP4")

と答えが返ってきました。

なるほどさっきの100円を3人でという例だと1（円）に限りなく近い数値をある決まった桁まで求めて確度の高いものを算出する。でも限りなく近いであって100％の答えではないよ、ということらしいです。
(切り上げ切り下げとかの関係かな？)

### 1.そもそも浮動小数点数型とはなにか？

[浮動小数点数を分かりやすく解説](https://medium-company.com/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0/)より

> 浮動小数点数とは、コンピュータにおける数値を表現する方法の一つで、主に小数点を含む数値を表現するときに利用されています。

こちらの記事ではこのほかにもかなりわかりやすく解説が載っていて計算方法も載っていました。
（次回の記事でビットなどを取り扱えればと思います。今回はこんなのあるんだな～くらいで行きます）

また、以下の記事のように計算上実際の計算と浮動小数で計算した数値で誤差が出るようです
[浮動小数点数の表現と誤差](http://www.edu.cc.uec.ac.jp/~ta113003/htsecure/lecture/ref/FloatingPoint.html)

どう使い分けたらいいかを記載しているサイトもありました
[【精度か速度か】float型とdouble型の変数の違い](https://kisaragi2342.com/float-or-double/)
### 2.浮動小数点数についてまとめると
- 0と1のみの数字で数値を表すということらしい
- 数値を0と1の2種類で表現したとき、32桁で表せば32ビット、64桁だと64ビット
- あくまでも**限りなく近似した数値**を出力するので桁によっては結果の値が変わる

# 7. まとめ
さて、知らないものを調べていくうちにかなり長くなってしまいましたがまとめるとすると……

|型名  |認識                         |使い方                                                                                |
|:-:   |:-:                          |:-                                                                                  |
|int   |10進数・32ビット（4バイト）   |精密な精度を求めない、または処理速度を重視する場合などで使用                              |
|float |2進数・32ビット（4バイト）    |より精度を求めるまたはメモリ領域を節約したい場合などで使用<br>近似値であって確実に正確ではない|
|double|2進数・64ビット（8バイト）    |floatよりも高い精度を求める場合に使用<br>近似値であって確実に正確ではない   　　　　　　　　 |

# 8. おわりに
### 1.調べてみた感想
正直数学は苦手で計算自体が苦手ですが、計算方法を見ると想像より難しくない方法だったのが意外で良い収穫でした。

これから何かを開発する際に、設計段階でメモリ領域についてもどれくらいの容量が必要か考えて作れるようになれると尚良いのかなと思います。

ビットやら2進数10進数、計算方法なども調べていたのですがこの記事に入れるとかなり長くなるので分けることにしました。

なるべく早めにこの数学苦手筆者が調べてみたシリーズ（タイトルが頭悪いですが💧）第2弾出せたらと考えています。

※何なら英語も苦手で調べるまで"Double"を「ドーブル」と読んでしまっていたくらいですが、今のところわからない文や単語について調べまくっていったら何とかなっているのでプログラミングやってて『意外となるようになるもんだな……』という印象です。

### 2.ChatGTP3.5と4を比較利用した所感と更なる検証
##### ChatGTP3.5は少々命令に対して的外れな回答がある・情報が少し古め?

特に**小学生にもわかるように倍精度浮動小数について説明してください**と指定したにもかかわらず

> 倍精度浮動小数点数とは、コンピュータで数値を表現するための一種の形式のことです。この形式では、数値を2進数の桁数で表現します。

と始まり、そもそも「2進数とはなにか」について説明もなく始まりました。

（今どきの小学生は2進数やら10進数の概念等知ってて当たり前……？そんな、まさか……^^;）

float型とdouble型の処理速度についても若干古い？情報っぽい気がしました。

##### ChatGTP4は答え+αで答えを返してくる
【ChatGTPに聞いてみた1】で顕著な差が出ている気がするのですが、3.5は事実を簡潔にといった感じですが、4では事実とともに例も出しており、質問者に対してより理解しやすいように返答していてそういったところも進歩しているのかと感心しました。

##### 試しに「生活に役立つ知恵を１つ教えてください」「教える知恵としてなぜそれを選んだのか教えてください」と投げてみたら……
【ChatGTP3.5の回答】
> 生活に役立つ知恵の一つとして、「バランスを保つこと」があります。バランスを保つことは、身体的な健康だけでなく、心理的な健康や生活全般において重要です。以下にいくつかのバランスを保つポイントを挙げます。

と以降いくつかのポイントを挙げてくれました。

○○しましょう・○○は役立ちますという風に、なんというかセミナーとかの先生みたいな提案の仕方で押し付けない感じ？でした。

そして理由については
> 私はAIですので、感情や選択の理由を持ちませんが、一般的に「バランスを保つこと」は生活に役立つ知恵として選ばれることが多いです。
：
バランスを保つことは、生活の質を高め、健康的で充実した日々を送るための重要な指針となります。そのため、一般的に人々はバランスを意識し、バランスの取り方や調整方法について学ぶことを好むのかもしれません。

とあくまで今迄のデータの平均値から取り出したような振舞いでした。
半分受動的な印象ですね。

【ChatGTP4の回答】

> もちろんです。以下に生活に役立つ知恵をご紹介します。「スマートゴール」の設定法
目標を設定する際には、「SMART」（スマート）というアクロニムを覚えておくと役立ちます。これは、効果的な目標設定のための5つの要素を表しています。

と以降SMARTについて説明してくれました。

○○するべき・○○でなければならない、という風にジムとか部活のコーチみたいな主張というか強制力の強い感じでした。

理由については
> スマートゴール」の設定法を選んだ理由は、人々が日常生活で目標を設定し、それを達成するための具体的な方法を提供することができるからです。
:
この方法は、どんな目標にも適用することができ、目標設定の際に有用なガイドラインとなるため、生活に役立つ知恵として選びました。

とAI自身が出来ることの一つとして提案した、という振舞いです。

データの平均値ではなく、数あるデータの中から方法として詳しく提案できるという理由で能動的に動いているような印象です。

こういった思考と行動も想像以上に変化があるようですね。

あと、ChatGTP4の「教えてください」に対して「もちろんです！」と返ってくるのを見て、居酒屋で注文して「喜んで！」って言われたようなイメージがあります（元気な感じがそうさせるのかも？笑）

ちょっとした好奇心から聞いてみたものでしたが面白い結果になりました。

長くなってしまいましたが、ここまで記事を読んでくださりありがとうございました:relaxed:

# 9. 利用したもの一覧
- ChatGTP3.5
- ChatGTP4
### 参考サイト一覧
-  [データ型とは?](https://blog.senseshare.jp/%20data-type.html#:~:text=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E6%89%B1%E3%81%86%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AB,%E3%80%8C%E5%9E%8B%E3%80%8D%E3%81%A8%E8%A8%80%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)
-  [int型とは？int型とdouble型の違いやint型変数の宣言と演算の例を紹介！](https://www.fenet.jp/infla/column/technology/int%E5%9E%8B%E3%81%A8%E3%81%AF%EF%BC%9Fint%E5%9E%8B%E3%81%A8double%E5%9E%8B%E3%81%AE%E9%81%95%E3%81%84%E3%82%84int%E5%9E%8B%E5%A4%89%E6%95%B0%E3%81%AE%E5%AE%A3%E8%A8%80%E3%81%A8%E6%BC%94%E7%AE%97/)
-  [変数「float型」と「double型」の違いとは？メリットとデメリット、用途も元社内SEがわかりやすく解説](https://study-z.net/100190548/2)
- [第４章　キャストが好き float型対double型](http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html)
- [x86でdoubleがfloatより速いかどうかを検証してみた](https://qiita.com/telmin_orca/items/455dab4a6ffd4545ee95)
- [倍精度浮動小数点数型 【double precision floating point number type】](https://e-words.jp/w/%E5%80%8D%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E5%9E%8B.html)
- [浮動小数点数を分かりやすく解説](https://medium-company.com/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0/)
- [浮動小数点数の表現と誤差](http://www.edu.cc.uec.ac.jp/~ta113003/htsecure/lecture/ref/FloatingPoint.html)
- [【精度か速度か】float型とdouble型の変数の違い](https://kisaragi2342.com/float-or-double/)