数値のデータ型についての質問です。
整数型としては、特別な理由がない限りはint型を使用するのが基本という認識なのですが、"わざわざ"shortやlongを用いる場合には、どのような理由が考えられますか?使用するメモリサイズやパフォーマンスという観点の他、「あるメソッドが返す値のデータ型に合わせる」といった理由も考えられるかもしれませんが、この場合にも「なぜそのメソッドでは"わざわざ"longやshortを戻り値の型として用いているのか」という疑問が生じます。
また浮動小数点数型としては、特別な理由がない限りはdouble型を使用するのが基本という認識なのですが、"わざわざ"floatを用いる場合には、どのような理由が考えられますか?なんらかの恩恵を受けられるものなのでしょうか。
データ型としては無難にintやdoubleを用いており、short・long### ヘディングのテキストやfloatをあえて使ってみるという思考に至りません。他人が書いたプログラムで使われているのを見ると、データ型に対する理解の浅さに不安を覚えることがあります。深く考えすぎでしょうか?
やはりデータの送受信を伴う場合などには、データ型に関してもシビアに考えなくてはならないものでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/21 09:14

退会済みユーザー
2022/05/21 09:37

回答3件
0
(自己解決の早い人ですね…)
longはintより長いので除くとして、ビット数の少ない型を使う恩恵として重要なものとしては、処理の高速化が挙げられます。
常にではありませんが、並列計算が可能な場合や倍精度浮動小数点数の演算器が単精度に比べて少ない環境、またメモリアクセスのパターンによっては、intよりshort、doubleよりfloatの方が計算が速い場合があります。
例として以下の(並列計算に対応した)numpyを使った行列の乗算は私の環境で、型がf8(倍精度)では1.7秒ほどに対し、f4(単精度)では0.9秒ほどに短縮されました。
Python
1import numpy as np 2import random 3import time 4random.seed(0) 5size = 4096 6testtype = 'f4' #型をf4=単精度・f8=倍精度で比較 7temp = [[random.random() for i in range(size)] for j in range(size)] 8matA = np.matrix(temp, dtype=testtype) 9temp = [[random.random() for i in range(size)] for j in range(size)] 10matB = np.matrix(temp, dtype=testtype) 11start = time.perf_counter() 12matX = np.matmul(matA, matB) 13print(time.perf_counter() - start)
もう1例として、以下のCで特に意味もなくメモリアクセスするコードは私の環境でintで0.65秒ほどに対しshortでは0.5秒ほどに短縮されました。(もっと大きく短縮される例を示したかったところですが、まあ短縮しうることは示せたのでよしとします)
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#define ARR_SIZE 0x1000000 5#define COUNT 100000000 6int main(void) 7{ 8 srand(0); 9 int* arr = malloc(ARR_SIZE*sizeof(int)); //arrの型をint・shortで比較 10 int* diffList = malloc(COUNT*sizeof(int)); 11 for(int i=0; i<ARR_SIZE; i++) 12 { 13 arr[i] = rand()%0x100; 14 } 15 for(int i=0; i<COUNT; i++) 16 { 17 diffList[i] = (rand()%0x100)>>(rand()%8); 18 } 19 20 int sum=0; 21 int ptr=0; 22 clock_t start = clock(); 23 for(int i=0; i<COUNT; i++) 24 { 25 ptr += diffList[i]; 26 ptr%=ARR_SIZE; 27 sum += arr[ptr]; 28 } 29 clock_t end = clock(); 30 printf("%d, %f", sum, (double)(end-start)/CLOCKS_PER_SEC); 31 return 0; 32}
投稿2022/05/21 22:43
編集2022/05/21 22:47総合スコア3047
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/21 23:24

退会済みユーザー
2022/05/22 01:24 編集
2022/05/22 02:39
2022/05/22 07:45

退会済みユーザー
2022/05/22 08:15 編集
2022/05/25 12:17 編集

退会済みユーザー
2022/05/26 03:05
2022/05/26 05:20
2022/05/26 05:22
2022/05/27 23:16 編集
2022/05/31 22:54
2022/06/04 11:52 編集
2022/06/06 09:42
2022/06/09 23:15
2022/06/23 15:50
2022/06/23 15:50
2022/06/23 15:53
2022/06/23 15:54

0
自己解決
一般論や慣習などがあれば知りたかったところではありますが、使うべきところでは使う。あとは触って慣れろ。というレベルの話でしかない内容でした。
投稿2022/05/21 12:05
総合スコア32
0
既に自己解決してますが…
long
と int
と short
と sbyte
では値域が異なる
↓
であれば,情報の値域に応じて型を使い分けることを「わざわざ」と表現する感覚の方が謎ですので,そこを述べるべきだったのでは.
「sbyte
や short
で十分なときに int
を使う」ことの方が「何故?」と感じますが……
あえて int
を用いるのが「無難」とはどういう意味なのか?
例えば,たかだか 0~20 くらいの値しか扱わないときには byte
で十分なわけですが,そこを int
にすると何か恩恵があるのか? 無いならば,何故「わざわざ」int
にするのか?
そこに恩恵が無いならば → 自然と byte
が選択されるのでは?
投稿2022/05/23 02:39
総合スコア12151
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2022/05/26 06:23
2022/05/26 11:21

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。