/*
* FP rounding modes
*/
typedef enum {
FP_RN=0, /* round to nearest */
FP_RM, /* round down to minus infinity */
FP_RP, /* round up to plus infinity */
FP_RZ /* truncate */
} fp_rnd_t;
という定義がある。#include <ieeefp.h> fpsetround(FP_RN) /* 一番近い数に丸める */ fpsetround(FP_RM) /* マイナス無限大方向に丸める */ fpsetround(FP_RP) /* プラス無限大方向に丸める */ fpsetround(FP_RZ) /* 小数部を0にする (truncate) */ fpgetround() /* 設定状態が得られる */
/* Definitions of rounding direction macros */
enum {
FE_TONEAREST = 0x00000000,
FE_TOWARDZERO = 0x00000001,
FE_UPWARD = 0x00000002,
FE_DOWNWARD = 0x00000003
};
が定義されている。
#include <fenv.h> fesetround(FE_TONEAREST) /* 一番近い数に丸める */ fesetround(FE_UPWARD) /* プラス無限大方向に丸める */ fesetround(FE_DOWNWARD) /* マイナス無限大方向に丸める */ fesetround(FE_TOWARDZERO ) /* 小数部を0にする (truncate) */ fegetround() /* 設定状態が得られる */
product()
{
int i, n;
double prod;
double tmp;
n = ND;
prod = 0.0;
for(i=0; i < n; i++){
tmp = A[i]*B[i];
prod += tmp;
}
printf("product = %25.20f\n", prod);
}
を実行。Near:0.50000000000000011102 Up: 0.50000000000000766054 Down:0.49999999999999328315 Chop:0.49999999999999977796
int i; double a; i = a; /* 切り捨て */ i = a + 0.5; /* 四捨五入 */ i = a + 0.9; /* 切上げ */これを少し応用すれば、小数点以下2桁にする四捨五入(小数3桁目を四捨五入)も できる。
int i; double a; a=a*100; i = a + 0.5; /* 四捨五入 */ a=i/100.0;あまりに表現の限界に近い場合は、精度が失われるかも知れないが、 計算機が出現した古来より、普通に使われる定石である。