C++のfrexp()関数とは?浮動小数点数を仮数と指数に分解する方法を解説
frexp()関数は、浮動小数点数を仮数(significand)と2を底とする整数の指数(exponent)に分解するための数学関数です。この関数は正規化されたバイナリ仮数を返し、戻り値の範囲は0.5以上1未満となります。引数に0を渡した場合は、仮数・指数のいずれも0が返されます。
frexp()の動作は、次の数式で表すことができます。
x = significand * (2^exponent)
つまり、任意の浮動小数点数xは「0.5以上1未満の仮数」と「2のべき乗」との積として表現できます。この性質を利用することで、浮動小数点数の内部構造の調査や数値解析など、さまざまな場面でfrexp()が役立ちます。
C++におけるfrexp()の構文
float frexp(float variable_name, int* exponent);
各パラメータの詳細は以下の通りです。
- variable_name − バイナリ仮数に分解したい浮動小数点数を保持する変数の名前です。
- exponent − 計算結果の指数値が格納されるint型へのポインタです。
frexp()はfloat型以外にも対応しており、double型やlong double型を受け取るオーバーロードも用意されています。使用する際は、ヘッダー<cmath>(C言語では<math.h>)をインクルードしてください。
frexp()の使用例
それでは、C++でfrexp()を実際に使ったサンプルコードを見てみましょう。
サンプルコード
#include <iostream>
#include <math.h>
using namespace std;
int main() {
double a = 4;
int b;
cout << "Value of a : " << a << ''\n';
double s = frexp(a, &b);
cout << a << " = " << s << " * " << "2^" << b;
return 0;
}実行結果
上記プログラムを実行すると、出力は以下のようになります。
Value of a : 4 4 = 0.5 * 2^3
実行結果の解説
このプログラムでは、数値4をfrexp()に渡しています。その結果、仮数として0.5、指数として3が求められました。これは「0.5 × 2³ = 0.5 × 8 = 4」という計算が成立していることを示しており、frexp()が意図どおりに動作していることが確認できます。
frexp()を使う際の注意点
- 第2引数のポインタには、有効なint型変数のアドレスを渡してください。初期化されていないポインタを渡すと、未定義動作を引き起こす恐れがあります。
- 入力値が0の場合、仮数・指数ともに0が返されます。
- 負の数を渡した場合も同様に分解でき、このとき仮数は−1より大きく−0.5以下の範囲の値となります。
-
C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】
この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の