1. 導入
C++で数値計算を行う際、「初期値として非常に大きな数を入れたい」「計算結果が範囲を超えたことを表現したい」という場面は頻繁に発生します。かつてはマクロ定数や適当な最大値を使って代用していましたが、これらは意図しないバグの温床となります。本記事では、標準ライブラリである std::numeric_limits
2. 基礎知識
std::numeric_limits は、
その中の infinity() メソッドは、IEEE 754 浮動小数点標準に従い、その型が表現できる「無限大(Infinity)」を返します。この値は、通常の数値(NaN:非数を除く)よりも大きく、演算においても数学的な無限大の性質(例:無限大 + 1 = 無限大)を維持します。
3. 実装/解決策
実装は非常にシンプルで、std::numeric_limits<型名>::infinity() を呼び出すだけです。
注意点として、この機能は浮動小数点型(float, double, long double)に対してのみ有効です。整数型で呼び出すとコンパイルエラーになるか、あるいは期待した動作にならないため、必ず浮動小数点型に対して使用してください。
4. サンプルプログラム
include
include
int main() {
// double型で無限大を取得
double inf = std::numeric_limits
std::cout << "取得した無限大の値: " << inf << std::endl;
// 無限大を使った計算例
double result = inf + 100.0;
std::cout << "無限大 + 100.0 = " << result << std::endl;
// 無限大の判定(実務では必須の確認処理)
if (std::isinf(result)) {
std::cout << "結果は無限大です。" << std::endl;
}
// 比較演算の例
if (result > 1.79e308) {
std::cout << "無限大は double の最大値よりも大きいです。" << std::endl;
}
return 0;
}
5. 応用・注意点
実務において最も重要なのは「無限大が計算過程で発生していないか」を適切にチェックすることです。
注意点1:ゼロ除算との関係
浮動小数点の計算でゼロ除算が発生した場合、結果は自動的に infinity になります。これを放置すると、後の処理でバグを引き起こす可能性があるため、計算結果が infinity になっていないか std::isinf() を使って随時チェックする癖をつけてください。
注意点2:NaNとの区別
無限大(infinity)と非数(NaN)は別物です。計算結果が不正な場合、NaN が返されることもあります。std::isnan() と併せて活用することで、より堅牢な数値計算ロジックを構築できます。
注意点3:整数型へのキャスト
無限大を整数型(intなど)にキャストすると、結果は未定義動作になるか、処理系依存の非常に大きな値(多くの場合、型の最大値)に変換されます。整数演算の代用として infinity を使うことは避けてください。

コメント