C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++における浮動小数点数の精度制御(floor()・ceil()・trunc()・round()・setprecision())

浮動小数点数の精度とは、小数点以下の値をどこまで正確に保持できるかを表す尺度です。

たとえば、10 ÷ 6 = 1.6666666… のように循環小数となる計算結果は、厳密に保存しようとすると無限のメモリが必要になります。

そこで、メモリのオーバーフローを防ぐために、コンパイラ側で精度の上限が設定されています。C++のfloat型の場合、この精度は小数点以下6〜7桁程度であり、それ以降の桁が循環する場合は値が破棄されます。

この切り捨てによって大きな誤差が生じるのを避けるため、C++には浮動小数点数の丸めや精度指定を行うための関数やライブラリが用意されています。本記事では、代表的なものとして floor()ceil()trunc()round()setprecision() の使い方を解説します。

floor() ― 切り下げ

floor() 関数は、数値を「その数以下で最も近い整数」へ丸める(切り下げる)関数です。負の数に対しては、整数部分からさらに1つ小さい値を返す点に注意が必要です。

ヘッダー: <cmath>(C言語では <math.h>

コード例

#include<iostream>
#include<math.h>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.2342, number3 = -3.31132, number4 = -0.432;
    cout<<"Values are : \n";
    cout<<"Number 1 : "<<floor(number1)<<endl;
    cout<<"Number 2 : "<<floor(number2)<<endl;
    cout<<"Number 3 : "<<floor(number3)<<endl;
    cout<<"Number 4 : "<<floor(number4)<<endl;
    return 0;
}

出力結果

Values are :
Number 1 : 0
Number 2 : 234
Number 3 : -4
Number 4 : -1

ceil() ― 切り上げ

ceil() 関数は、数値を「その数以上で最も近い整数」へ丸める(切り上げる)関数です。floor() とは逆の動作をします。

ヘッダー: <cmath>(C言語では <math.h>

コード例

#include<iostream>
#include<math.h>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.2342, number3 = -3.31132, number4 = -0.432;
    cout<<"Values are : \n";
    cout<<"Number 1 : "<<ceil(number1)<<endl;
    cout<<"Number 2 : "<<ceil(number2)<<endl;
    cout<<"Number 3 : "<<ceil(number3)<<endl;
    cout<<"Number 4 : "<<ceil(number4)<<endl;
    return 0;
}

出力結果

Values are :
Number 1 : 1
Number 2 : 235
Number 3 : -3
Number 4 : -0

trunc() ― 小数部の切り捨て

trunc() 関数は、小数部分を単純に切り捨て、整数部分だけを取り出す関数です。正の数・負の数どちらに対しても「0方向への丸め」を行う点が特徴で、floor() が負の数でより小さい値を返すのとは挙動が異なります。

ヘッダー: <cmath>(C言語では <math.h>

コード例

#include<iostream>
#include<math.h>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.2342, number3 = -3.31132, number4 = -0.432;
    cout<<"Values are : \n";
    cout<<"Number 1 : "<<trunc(number1)<<endl;
    cout<<"Number 2 : "<<trunc(number2)<<endl;
    cout<<"Number 3 : "<<trunc(number3)<<endl;
    cout<<"Number 4 : "<<trunc(number4)<<endl;
    return 0;
}

出力結果

Values are :
Number 1 : 0
Number 2 : 234
Number 3 : -3
Number 4 : -0

round() ― 四捨五入

round() 関数は、数値を「最も近い整数」へ四捨五入する関数です。結果は元の数値より大きくなることもあれば、小さくなることもあります。小数第一位が5ちょうどの場合は、0から遠い方向へ丸められます。

ヘッダー: <cmath>(C言語では <math.h>

コード例

#include<iostream>
#include<math.h>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.5612, number3 = -3.31132, number4 = -0.9132;
    cout<<"Values are : \n";
    cout<<"Number 1 : "<<round(number1)<<endl;
    cout<<"Number 2 : "<<round(number2)<<endl;
    cout<<"Number 3 : "<<round(number3)<<endl;
    cout<<"Number 4 : "<<round(number4)<<endl;
    return 0;
}

出力結果

Values are :
Number 1 : 0
Number 2 : 235
Number 3 : -3
Number 4 : -1

setprecision() ― 出力時の桁数指定

setprecision() 関数は、浮動小数点数を指定した桁数(引数 n)まで正確に出力するためのマニピュレータです。fixed を組み合わせることで、「小数点以下 n 桁」という固定小数点表示が可能になります。

ヘッダー: <iomanip>

コード例

#include<iostream>
#include<iomanip>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.5612, number3 = -3.31132, number4 = -0.9132;
    cout<<"Number 1 correct upto 0 decimals "<<fixed<<setprecision(0)<<number1<<endl;
    cout<<"Number 2 correct upto 1 decimals "<<fixed<<setprecision(1)<<number2<<endl;
    cout<<"Number 3 correct upto 4 decimals "<<fixed<<setprecision(4)<<number3<<endl;
    cout<<"Number 4 correct upto 3 decimals "<<fixed<<setprecision(3)<<number4<<endl;
    return 0;
}

出力結果

Number 1 correct upto 0 decimals 0
Number 2 correct upto 1 decimals 234.6
Number 3 correct upto 4 decimals -3.3113
Number 4 correct upto 3 decimals -0.913

まとめ

関数動作ヘッダー
floor()切り下げ(数以下の最大の整数)<cmath>
ceil()切り上げ(数以上の最小の整数)<cmath>
trunc()小数部の切り捨て(0方向への丸め)<cmath>
round()四捨五入(最近接の整数)<cmath>
setprecision()出力時の有効桁数/小数桁数の指定<iomanip>

用途に応じてこれらの関数を使い分けることで、浮動小数点演算における意図しない誤差を抑え、より信頼性の高いプログラムを作成できます。

  1. C++でデューデニー数(Dudeney Number)を判定する方法

    デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ

  2. C++で二分探索木(BST)からCeiling(天井)とFloor(床)を求める方法

    本記事では、二分探索木(BST)からCeiling(天井)値とFloor(床)値を求める方法について解説します。まず用語を整理しておきましょう。あるキーに対する「Ceiling」とは、そのキー以上の値の中で最小の要素を指し、「Floor」とはそのキー以下の値の中で最大の要素を指します。応用例:メモリ管理システム例えば、メモリ管理システムを構築することを考えてみます。空きメモリブロック(フリーノード)がBST上に配置されており、入力された要求サイズに対して最適なフィット(ベストフィット)を見つけたい場面です。このとき、ツリーを降下しながら「キー値より大きい最小のデータ」を追跡していくことになりま