C++の浮動小数点数操作関数の使い方徹底解説
小数をコンピュータ上で数値として扱う場合、その実装は「浮動小数点数(floating point number)」と呼ばれます。C++では、float型のサイズは32ビットです。標準ライブラリのcmathには、浮動小数点数を操作するための関数が数多く用意されており、これらを活用することで数値計算を効率的かつ正確に行うことができます。本記事では、代表的な浮動小数点数操作関数を紹介します。
fmod()関数
fmod()関数は、引数として渡された2つの値を除算した際の剰余を返します。
サンプルコード
#include <iostream>
#include <cmath>
using namespace std;
int main() {
float a, b, rem;
a = 23.4;
b = 4.1;
rem = fmod(a,b);
cout<<"The value of fmod( "<<a<<" , "<<b<<" ) = "<<rem;
}
実行結果
The value of fmod( 23.4 , 4.1 ) = 2.9
remainder()関数
remainder()関数は、fmod()関数と同様に除算の剰余を返します。ただし、この関数は数値として最小の剰余(0に最も近い値)を返す点が特徴で、結果が負の値になることもあります。
サンプルコード
#include <iostream>
#include <cmath>
using namespace std;
int main() {
float a, b, rem;
a = 23.4;
b = 4.1;
rem = remainder(a,b);
cout<<"The value of remainder( "<<a<<" , "<<b<<" ) = "<<rem;
}
実行結果
The value of remainder( 23.4 , 4.1 ) = -1.2
remquo()関数
remquo()関数は、渡された2つの値の商と剰余の両方を取得できます。商の値は、引数として渡した変数への参照を通じて受け取ります。つまり、戻り値としてはremainder()関数と同じ剰余を返し、商は参照先の変数に格納されます。
サンプルコード
#include <iostream>
#include <cmath>
using namespace std;
int main() {
float a, b, rem;
int quo;
a = 23.4;
b = 4.1;
rem = remquo(a,b,&quo);
cout<<a<<" and "<<b<<" passed to the remquo() function gives the following output\n";
cout<<"The remainder is "<<rem<<endl;
cout<<"The quotient is "<<quo;
}
実行結果
23.4 and 4.1 pass to the the remque() function gives the following output The reminder is -1.2 The quotient is 6
copysign()関数
copysign()関数は、第1引数の大きさ(絶対値)と第2引数の符号を組み合わせた値を返します。戻り値は、第1引数の絶対値に第2引数の符号を付けた数値になります。
サンプルコード
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double a, b;
a = 9.6;
b = -3.5;
cout<<"copysign function with inputs "<<a<<" and "<<b<<" is "<<copysign(a,b);
}
実行結果
Copysign function with inputs 9.6 and -3.5 is -9.6
fmin()関数
fmin()関数は、その名の通り、関数の2つの引数のうち小さい方の値を返します。戻り値の型は浮動小数点数です。
サンプルコード
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double a, b;
a = 43.5;
b = 21.2;
cout << "The smallest of "<<a<<" and "<<b<<" is "; cout << fmin(a,b)<<endl;
}
実行結果
The smallest of 43.5 and 21.2 is 21.2
fmax()関数
fmax()関数は、引数として渡された2つの数値のうち、大きい方の値を返します。
サンプルコード
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double a, b;
a = 43.5;
b = 21.2;
cout << "The largest of "<<a<<" and "<<b<<" is "; cout << fmax(a,b)<<endl;
}
実行結果
The largest of 43.5 and 21.2 is 43.5
fdim()関数
fdim()関数は、引数として渡された2つの数値の差の絶対値を返します。
サンプルコード
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double a, b;
a = 43.5;
b = 21.2;
cout << "The absolute difference of "<<a<<" and "<<b<<" is";
cout << fdim(a,b)<<endl;
}
実行結果
The absolute difference of 43.5 and 21.2 is 22.3
fma()関数
fma()関数は、融合乗算加算(fused multiply-add)と呼ばれる演算を行い、「第1引数 × 第2引数 + 第3引数」の計算結果を返します。3つの浮動小数点数の引数を受け取り、結果を浮動小数点数として返します。乗算と加算を1回の演算として処理するため、丸め誤差が最小限に抑えられ、高速かつ高精度な計算が可能です。
サンプルコード
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double a, b, c;
a = 3.5;
b = 2.4;
c = 7.2;
cout << "The multiplication of "<<a<<" , "<<b<<" and "<<c<<" is ";
cout << fma(a,b,c)<<endl;
}
実行結果
The multiplication of 3.5 , 2.4 and 7.2 is 15.6
以上が、cmathライブラリで定義されている、浮動小数点数を操作するための主な関数です。これらの関数を適切に使い分けることで、数値計算の精度と効率を高めることができます。
-
C++で点を別の点を中心として回転させる方法
原点を中心とした点の回転 点Xを原点を中心として角度θだけ反時計回りに回転させるには、以下の式を使用します。 原点を中心にθだけ反時計回りにXを回転する式: X * polar(1.0, θ) ここで使われている polar 関数は、<complex> ヘッダーファイルで定義されている複素数用の関数で、大きさ(絶対値)と位相角から複素数を生成するために使用されます。polar(mag, angle) を呼び出すと、対応する複素数が返されます。複素数を平面上の点として扱うことで、回転のような幾何学的な操作を簡潔に記述できるのがポイントです。 点Yを中心とした点Xの回転 ある点を別の
-
C++で学ぶコンピュータグラフィックスのポイントクリッピングアルゴリズム
コンピュータグラフィックスにおけるクリッピングとはコンピュータグラフィックスは、コンピュータの画面上に画像や図形を描画する技術です。ここでは、画面を2次元座標系として扱います。この座標系は左上の原点 (0,0) から始まり、右下に向かって広がります。ビューイングプレーン(視野面)とは、コンピュータグラフィックスにおいて図形を描画するために定義された領域のことであり、画面上の可視範囲を指します。クリッピングとは、このビューイングプレーンの外側にある点や図形を取り除く処理のことです。クリッピングを理解するために、具体例を見てみましょう。上図の例では、青色で示されたビューイングプレーンの外側にある点