名前空間
変種
操作

FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD

提供: cppreference.com
< cpp‎ | numeric‎ | fenv
 
 
 
浮動小数点環境
関数
(C++11)(C++11)
マクロ定数
FE_DOWNWARDFE_TONEARESTFE_TOWARDZEROFE_UPWARD
(C++11)
(C++11)
 
ヘッダ <cfenv> で定義
#define FE_DOWNWARD     /*implementation defined*/
(C++11およびそれ以降)
#define FE_TONEAREST    /*implementation defined*/
(C++11およびそれ以降)
#define FE_TOWARDZERO   /*implementation defined*/
(C++11およびそれ以降)
#define FE_UPWARD       /*implementation defined*/
(C++11およびそれ以降)

これらのマクロ定数はそれぞれ、サポートされている浮動小数点丸めモードのひとつを示すために std::fesetround および std::fegetround で使用することができる、非負の整数定数式に展開されます。 処理系は <cfenv> で追加の丸めモード定数を定義するかもしれません。 そのような定数はすべて FE_ で始まり、少なくとも1つの大文字が続くべきです。 各マクロはサポートされている場合のにみ定義されます。

ほとんどの処理系では、これらのマクロは FLT_ROUNDS および std::float_round_style の値と等しい値に展開されます。

定数 説明
FE_DOWNWARD 負の無限大に向かった丸め
FE_TONEAREST 表現可能な最も近い値に向かった丸め
FE_TOWARDZERO ゼロに向かった丸め
FE_UPWARD 正の無限大に向かった丸め

処理系によって追加の丸めモードがサポートされているかもしれません。

現在の丸めモードは以下に影響します。

double x = 1;
x/10; // 0.09999999999999999167332731531132594682276248931884765625
   // or 0.1000000000000000055511151231257827021181583404541015625
std::sqrt(2); // 1.41421356237309492343001693370752036571502685546875
           // or 1.4142135623730951454746218587388284504413604736328125
  • 浮動小数点から浮動小数点への暗黙の変換およびキャスト
double d = 1 + std::numeric_limits<double>::epsilon();
float f = d; //  1.00000000000000000000000
           // or 1.00000011920928955078125
std::stof("0.1"); // 0.0999999940395355224609375
               // or 0.100000001490116119384765625
std::lrint(2.1); // 2 or 3

現在の丸めモードは以下には影響しません。

  • 浮動小数点から整数への暗黙の変換およびキャスト (常にゼロに向かって丸められます)
  • コンパイル時に実行される式内の浮動小数点算術演算子の結果 (常に最も近い値に丸められます)
  • ライブラリ関数 std::roundstd::lroundstd::ceilstd::floorstd::trunc

あらゆる浮動小数点環境の機能と同様、丸めは #pragma STDC FENV_ACCESS ON が設定されている場合にのみ保証されます。

[編集]

#include <iostream>
#include <iomanip>
#include <string>
#include <cfenv>
#include <cmath>
int main()
{
#pragma STDC FENV_ACCESS ON
    std::fesetround(FE_DOWNWARD);
    std::cout << "rounding down: \n" << std::setprecision(50)
              << "         pi = " << std::acos(-1.f) << '\n'
              << "stof(\"1.1\") = " << std::stof("1.1") << '\n'
              << "  rint(2.1) = " << std::rint(2.3) << "\n\n";
    std::fesetround(FE_UPWARD);
    std::cout << "rounding up: \n"
              << "         pi = " << std::acos(-1.f) << '\n'
              << "stof(\"1.1\") = " << std::stof("1.1") << '\n'
              << "  rint(2.1) = " << std::rint(2.3) << '\n';
}

出力:

rounding down: 
         pi = 3.141592502593994140625
stof("1.1") = 1.099999904632568359375
  rint(2.1) = 2
 
rounding up: 
         pi = 3.1415927410125732421875
stof("1.1") = 1.10000002384185791015625
  rint(2.1) = 3

[編集] 関連項目

浮動小数点の丸めモードを表します
(列挙) [edit]
(C++11)(C++11)
丸め方向を取得または設定します
(関数) [edit]
浮動小数点丸めモードマクロC言語リファレンス