C++ で浮動小数点数の精度を設定する

胡金庫 2023年10月12日
  1. C++ で浮動小数点数の精度を設定するには std::setprecision を使う
  2. std::floorstd::ceil を使用して浮動小数点数の精度を変更する
  3. std::round および std::lround を使用して、浮動小数点数の精度を変更する
C++ で浮動小数点数の精度を設定する

この記事では、C++ で浮動小数点数の精度を設定する方法のいくつかの方法について説明します。

C++ で浮動小数点数の精度を設定するには std::setprecision を使う

std::setprecision は、入力/出力ストリームのフォーマットに使用できる STL I/O マニピュレータライブラリの一部です。setprecision は浮動小数点数の精度を変更し、小数点以下に表示する桁数を指定する整数パラメーターのみを取ります。つまり、浮動小数点数に対して暗黙的に想定されるデフォルトの精度は、コンマの後の 6 桁です。それでも、数が少なすぎてマニピュレータが使用されていない場合、フロートが科学的記数法で表示されることがあります。次のサンプルコードに示すように、このような数値はすべての有効数字を失い、ゼロとして表示される場合があることに注意してください。

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::setprecision;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.012,
                          26.9491092019, 113,    0.000000234};

  for (auto &i : d_vec) {
    cout << i << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << setprecision(3) << i << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.231 | 2.234 | 0.012 | 26.949 | 113.000 | 0.000 |

std::floorstd::ceil を使用して浮動小数点数の精度を変更する

std::floor 関数と std::ceil 関数は、元々C 標準ライブラリに実装されていた <cmath> ヘッダーによって提供されます。ceil 関数は、唯一の引数として渡された浮動小数点以上の最小の整数値を計算します。一方、floor は、引数以下の最大の整数値を計算します。これらの関数は、floatdouble、および long double タイプに対して定義されています。

#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.012,
                          26.9491092019, 113,    0.000000234};

  for (auto &i : d_vec) {
    cout << i << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::ceil(i) << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::floor(i) << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
124.000000 | 3.000000 | 1.000000 | 27.000000 | 113.000000 | 1.000000 |
123.000000 | 2.000000 | 0.000000 | 26.000000 | 113.000000 | 0.000000 |

std::round および std::lround を使用して、浮動小数点数の精度を変更する

または、std::roundstd::round を使用して、ゼロから四捨五入された最も近い整数値を計算できます。これらの関数は、浮動小数点演算関連のエラーをスローする可能性があります。これについては、ページで詳しく説明されています。

#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.012,
                          26.9491092019, 113,    0.000000234};

  for (auto &i : d_vec) {
    cout << i << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::round(i) << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::lround(i) << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.000000 | 2.000000 | 0.000000 | 27.000000 | 113.000000 | 0.000000 |
123 | 2 | 0 | 27 | 113 | 0 |
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Float