C++でdouble型(float型)がNaNかどうかを判定する方法
C++において、浮動小数点数(float型やdouble型)がNaN(Not a Number:非数)かどうかを判定するには、isnan()関数を使用します。この関数はcmathヘッダに定義されており、C++11で導入されました。そのため、C++11以降の環境で利用できます。
NaNは「0による除算」や「負の数の平方根」など、数学的に定義できない演算の結果として発生する特別な浮動小数点値です。NaNは自分自身とすら等しくならない(NaN == NaNがfalseになる)という特殊な性質を持つため、比較演算子ではなくisnan()関数を使った判定が推奨されます。
サンプルコード
#include <cmath>
#include <iostream>
using namespace std;
int main() {
if (isnan(sqrt(30))) { // 30の平方根は有効な浮動小数点数
cout << "30の平方根は数値ではありません" << endl;
} else {
cout << "30の平方根は数値です" << endl;
}
if (isnan(sqrt(-30))) { // -30の平方根は虚数となるためNaN
cout << "-30の平方根は数値ではありません" << endl;
} else {
cout << "-30の平方根は数値です" << endl;
}
return 0;
}実行結果
30の平方根は数値です -30の平方根は数値ではありません
解説
sqrt(30)は有効な実数値を返すため、isnan()はfalseを返します。一方、sqrt(-30)は実数として定義できないため、演算結果はNaNとなり、isnan()はtrueを返します。
なお、C++11以前の環境では、std::numeric_limits<double>::quiet_NaN()との比較や、x != xという自己比較のテクニックを使ってNaNを判定することも可能です。ただし、可読性と移植性の観点から、可能であればisnan()の使用を推奨します。
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の
-
C++で二重積分を計算するプログラム|シンプソン1/3則による数値積分の実装
変数xの下限・上限、変数yの下限・上限、そしてx・yそれぞれの刻み幅(ステップ幅)が与えられたとき、二重積分を数値的に計算し、その結果を表示するのが本記事のテーマです。 入出力の例 入力: xの刻み幅 = 1.2 yの刻み幅 = 0.54 xの下限 = 1.3 xの上限 = 2.1 yの下限 = 1.0 yの上限 = 2.1 出力: double integration is : 2.1 計算のアプローチ 本プログラムでは、以下の手順で二重積分を求めます。 xとyの上限・下限の値に加えて、x・yそれぞれの刻み幅を入力として受け取ります。 二重積分の計算にはシンプソン1/3則(Simpson