4.2 少し戻って丸めモード

これは kv とは直接関係ない話。

testfesetround1.cc
/*
 * testfesetround1.cc
 *   g++ testfesetround1.cc
 */

#include <iostream>
#include <math.h>
#include <fenv.h>

void testrint(void)
{
  int i;
  double x;
  for (i = -20; i <= 20; i++) {
    x = (double) i / 10;
    std::cout << "x=" << x << " ";
    std::cout << "rint(x)=" << rint(x) << std::endl;
  }
}

int main(void)
{
  std::cout << "まず普通に rint() を使う。rounding to the nearest even を確認"
            << std::endl;
  testrint();

  std::cout << "fsetround(FE_DOWNWARD) をして同じことをする。" << std::endl;
  fesetround(FE_DOWNWARD);
  testrint();

  std::cout << "fsetround(FE_UPWARD) をして同じことをする。" <<	std::endl;
  fesetround(FE_UPWARD);
  testrint();

  std::cout << "fsetround(FE_TOWARDZERO) をして同じことをする。" << std::endl;
  fesetround(FE_TOWARDZERO);
  testrint();

  return 0;
}

rint() は、double 型のデータを 整数に四捨五入 (正確には rounding to the ...) する関数と覚えていたけれど、 double 型のデータを丸めモードに従って整数値に丸める関数、 と覚え直す必要があるわけだ。

桂田 祐史
2016-03-04