C言語で処理系依存の整数と浮動小数点数の最小値と最大値の取得方法を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
処理系依存の整数と浮動小数点数の最小値と最大値の取得
処理系依存の整数と浮動小数点数の最小値と最大値は,それぞれ以下のヘッダで定義されています.
処理系依存の整数の最小値と最大値の取得
limits.hにある処理系依存の整数の最小値と最大値を取得するコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <limits.h> int main(void) { printf("MB_LEN_MAX = %d\n", MB_LEN_MAX); printf("CHAR_BIT = %d\n", CHAR_BIT); printf("CHAR_MIN = %d\n", CHAR_MIN); printf("CHAR_MAX = %d\n", CHAR_MAX); printf("SCHAR_MIN = %d\n", SCHAR_MIN); printf("SCHAR_MAX = %d\n", SCHAR_MAX); printf("UCHAR_MAX = %u\n", UCHAR_MAX); printf("SHRT_MIN = %d\n", SHRT_MIN); printf("SHRT_MAX = %d\n", SHRT_MAX); printf("USHRT_MAX = %u\n", USHRT_MAX); printf("INT_MIN = %d\n", INT_MIN); printf("INT_MAX = %d\n", INT_MAX); printf("UINT_MAX = %u\n", UINT_MAX); printf("LONG_MIN = %ld\n", LONG_MIN); printf("LONG_MAX = %ld\n", LONG_MAX); printf("ULONG_MAX = %lu\n", ULONG_MAX); printf("LLONG_MIN = %lld\n", LLONG_MIN); printf("LLONG_MAX = %lld\n", LLONG_MAX); printf("ULLONG_MAX = %llu\n", ULLONG_MAX); return 0; } |
マクロ定義の意味は以下になります.
- MB_LEN_MAX:全てのロケールでの1文字の最大マルチバイト長
- CHAR_BIT:char型の幅
- CHAR_MIN:char型の最小値
- CHAR_MAX:char型の最大値
- SCHAR_MIN:signed char型の最小値
- SCHAR_MAX:signed char型の最大値
- UCHAR_MAX:unsigned char型の再代替
- SHRT_MIN:short型の最小値
- SHRT_MAX:short型の最大値
- USHRT_MAX:unsigned short型の最大値
- INT_MIN:int型の最小値
- INT_MAX:int型の最大値
- UINT_MAX:unsigned int型の最大値
- LONG_MIN:long型の最小値
- LONG_MAX:long型の最大値
- ULONG_MAX:unsigned long型の最大値
- LLONG_MIN:long long型の最小値
- LLONG_MAX:long long型の最大値
- ULLONG_MAX:unsigned long long型の最大値
私の環境での実行結果は以下になります.
処理系依存で異なる結果になる可能性があることに注意して下さい.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ gcc limits.c $ a.out MB_LEN_MAX = 16 CHAR_BIT = 8 CHAR_MIN = -128 CHAR_MAX = 127 SCHAR_MIN = -128 SCHAR_MAX = 127 UCHAR_MAX = 255 SHRT_MIN = -32768 SHRT_MAX = 32767 USHRT_MAX = 65535 INT_MIN = -2147483648 INT_MAX = 2147483647 UINT_MAX = 4294967295 LONG_MIN = -9223372036854775808 LONG_MAX = 9223372036854775807 ULONG_MAX = 18446744073709551615 LLONG_MIN = -9223372036854775808 LLONG_MAX = 9223372036854775807 ULLONG_MAX = 18446744073709551615 |
処理系依存の浮動小数点数の最小値と最大値の取得
float.hにある処理系依存の浮動小数点数の最小値と最大値を取得するコードは以下になります.
※float.hはGCCコンパイラでビルトインとして実装されているため,ヘッダファイルがないことに注意して下さい.
主なマクロの定義の意味は以下になります.
他のマクロ定義の意味は,IEEE 754や深い数学の知識が必要なため省略します.
- FLT_MAX:float型の最大値
- DBL_MAX:double型の最大値
- LDBL_MAX:long double型の最大値
ここで,FLT_MINはfloat型の最小値にならないことに注意して下さい.
float型の最小値は-FLT_MAXです.
※double型やlong double型も同様です.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <float.h> #define PRECISION 50 int main(void) { printf("FLT_ROUNDS = %d\n", FLT_ROUNDS); printf("DBL_DIG = %d\n", DBL_DIG); printf("DBL_MANT_DIG = %d\n", DBL_MANT_DIG); printf("DBL_MAX_10_EXP = %d\n", DBL_MAX_10_EXP); printf("DBL_MAX_EXP = %d\n", DBL_MAX_EXP); printf("DBL_MIN_10_EXP = %d\n", DBL_MIN_10_EXP); printf("DBL_MIN_EXP = %d\n", DBL_MIN_EXP); printf("FLT_DIG = %d\n", FLT_DIG); printf("FLT_MANT_DIG = %d\n", FLT_MANT_DIG); printf("FLT_MAX_10_EXP = %d\n", FLT_MAX_10_EXP); printf("FLT_MAX_EXP = %d\n", FLT_MAX_EXP); printf("FLT_MIN_10_EXP = %d\n", FLT_MIN_10_EXP); printf("FLT_MIN_EXP = %d\n", FLT_MIN_EXP); printf("FLT_RADIX = %d\n", FLT_RADIX); printf("LDBL_DIG = %d\n", LDBL_DIG); printf("LDBL_MANT_DIG = %d\n", LDBL_MANT_DIG); printf("LDBL_MAX_10_EXP = %d\n", LDBL_MAX_10_EXP); printf("LDBL_MAX_EXP = %d\n", LDBL_MAX_EXP); printf("LDBL_MIN_10_EXP = %d\n", LDBL_MIN_10_EXP); printf("LDBL_MIN_EXP = %d\n", LDBL_MIN_EXP); printf("DBL_MAX = %le\n", DBL_MAX); printf("FLT_MAX = %e\n", FLT_MAX); printf("LDBL_MAX = %Le\n", LDBL_MAX); printf("DBL_EPSILON = %.*lf\n", PRECISION, DBL_EPSILON); printf("DBL_MIN = %.*lf\n", PRECISION, DBL_MIN); printf("FLT_EPSILON = %.*f\n", PRECISION, FLT_EPSILON); printf("FLT_MIN = %.*f\n", PRECISION, FLT_MIN); printf("LDBL_EPSILON = %.*Lf\n", PRECISION, LDBL_EPSILON); printf("LDBL_MIN = %.*Lf\n", PRECISION, LDBL_MIN); return 0; } |
私の環境での実行結果は以下になります.
処理系依存で異なる結果になる可能性があることに注意して下さい.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ gcc float.c $ a.out FLT_ROUNDS = 1 DBL_DIG = 15 DBL_MANT_DIG = 53 DBL_MAX_10_EXP = 308 DBL_MAX_EXP = 1024 DBL_MIN_10_EXP = -307 DBL_MIN_EXP = -1021 FLT_DIG = 6 FLT_MANT_DIG = 24 FLT_MAX_10_EXP = 38 FLT_MAX_EXP = 128 FLT_MIN_10_EXP = -37 FLT_MIN_EXP = -125 FLT_RADIX = 2 LDBL_DIG = 18 LDBL_MANT_DIG = 64 LDBL_MAX_10_EXP = 4932 LDBL_MAX_EXP = 16384 LDBL_MIN_10_EXP = -4931 LDBL_MIN_EXP = -16381 DBL_MAX = 1.797693e+308 FLT_MAX = 3.402823e+38 LDBL_MAX = 1.189731e+4932 DBL_EPSILON = 0.00000000000000022204460492503130808472633361816406 DBL_MIN = 0.00000000000000000000000000000000000000000000000000 FLT_EPSILON = 0.00000011920928955078125000000000000000000000000000 FLT_MIN = 0.00000000000000000000000000000000000001175494350822 LDBL_EPSILON = 0.00000000000000000010842021724855044340074528008699 LDBL_MIN = 0.00000000000000000000000000000000000000000000000000 |
まとめ
C言語で処理系依存の整数と浮動小数点数の最小値と最大値を取得する方法を紹介しました.
最小値と最大値が定義されているlimits.hとfloat.hを使いこなして,処理系毎に適切なコードを書けるようにしましょう.
データ型の最小値と最大値はキャストやオーバーフローと密接な関係にありますので,詳しく知りたいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!