これは kv とは直接関係ない話。
fesetround(FE_DOWNWARD); fesetround(FE_TONEAREST); fesetround(FE_TOWARDZERO); fesetround(FE_UPWARD);
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 型のデータを丸めモードに従って整数値に丸める関数、 と覚え直す必要があるわけだ。
桂田 祐史