数値のデータ型についての質問です。
整数型としては、特別な理由がない限りはint型を使用するのが基本という認識なのですが、"わざわざ"shortやlongを用いる場合には、どのような理由が考えられますか?使用するメモリサイズやパフォーマンスという観点の他、「あるメソッドが返す値のデータ型に合わせる」といった理由も考えられるかもしれませんが、この場合にも「なぜそのメソッドでは"わざわざ"longやshortを戻り値の型として用いているのか」という疑問が生じます。
また浮動小数点数型としては、特別な理由がない限りはdouble型を使用するのが基本という認識なのですが、"わざわざ"floatを用いる場合には、どのような理由が考えられますか?なんらかの恩恵を受けられるものなのでしょうか。
データ型としては無難にintやdoubleを用いており、short・long### ヘディングのテキストやfloatをあえて使ってみるという思考に至りません。他人が書いたプログラムで使われているのを見ると、データ型に対する理解の浅さに不安を覚えることがあります。深く考えすぎでしょうか?
やはりデータの送受信を伴う場合などには、データ型に関してもシビアに考えなくてはならないものでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
2022/05/21 09:14
2022/05/21 09:37
回答3件
1
(自己解決の早い人ですね…)
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総合スコア3006
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。
回答へのコメント
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
1
自己解決
一般論や慣習などがあれば知りたかったところではありますが、使うべきところでは使う。あとは触って慣れろ。というレベルの話でしかない内容でした。
投稿2022/05/21 12:05
総合スコア32
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
2022/05/21 12:28
2022/05/26 03:11
0
既に自己解決してますが…
long
と int
と short
と sbyte
では値域が異なる
↓
であれば,情報の値域に応じて型を使い分けることを「わざわざ」と表現する感覚の方が謎ですので,そこを述べるべきだったのでは.
「sbyte
や short
で十分なときに int
を使う」ことの方が「何故?」と感じますが……
あえて int
を用いるのが「無難」とはどういう意味なのか?
例えば,たかだか 0~20 くらいの値しか扱わないときには byte
で十分なわけですが,そこを int
にすると何か恩恵があるのか? 無いならば,何故「わざわざ」int
にするのか?
そこに恩恵が無いならば → 自然と byte
が選択されるのでは?
投稿2022/05/23 02:39
総合スコア10897
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
2022/05/26 06:23
2022/05/26 11:21
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
解決済
DefaultTableModelのremoveRow()メソッドに関して
回答2
クリップ1
更新
2023/05/21
Q&A
解決済
YahooApiを使ってキーワードをSystem.out.printlnでコンソールに提示したい
回答1
クリップ0
更新
2023/05/17
Q&A
解決済
コマンドライン引数を自作関数に渡したい。
回答3
クリップ1
更新
2023/05/12
Q&A
解決済
unity2Dでのメソッドを呼び出すためのSendMessageの使い方について
回答1
クリップ0
更新
2023/05/24
意見交換
クローズ
プログラミングの設計が分からない
回答24
クリップ11
更新
2023/04/17
Q&A
受付中
表計算(集計)機能を使い、データから最年長を表示したい
回答3
クリップ0
更新
2023/05/26
Q&A
解決済
円が波の動きをするようにしたい。
回答2
クリップ0
更新
2023/05/24
Q&A
解決済
C言語 西暦と月を入力してカレンダーを作成
回答3
クリップ0
更新
2023/05/16