llroundd32()、llroundd64()、llroundd128() - 最も近い整数への丸め

標準

標準/拡張機能 C/C++ 依存項目
C/C++ DFP 両方 z/OS® V1.8

形式

#define __STDC_WANT_DEC_FP__
#include <math.h>

long long int llroundd32(_Decimal32 x); 
long long int llroundd64(_Decimal64 x);
long long int llroundd128(_Decimal128 x); 

long long int llround(_Decimal32 x);   /* C++ only */
long long int llround(_Decimal64 x);   /* C++ only */
long long int llround(_Decimal128 x);  /* C++ only */
コンパイル要件: この関数を使用するには、long long データ型が必要です。long long を使用可能にする方法については、「z/OS XL C/C++ ランゲージ・リファレンス」を参照してください。

機能説明

llround() ファミリーの関数は、x を最も近い整数に丸め、2 つの整数の中間値の場合は、現行丸めモードに関係なくゼロから離れる方向に丸めます。
注 :
  1. IEEE 10 進数浮動小数点を使用するためには、ハードウェアに 10 進数浮動小数点機能 がインストールされている必要があります。
  2. これらの関数は、IEEE 10 進数浮動小数点形式で機能します。詳細は 「IEEE 10 進数浮動小数点」を参照してください。

戻り値

正常に実行された場合は、丸められた整数を戻します。該当する値が正または負であって、long long として表現するには大きすぎる場合は、ドメイン・エラーが発生し、未指定の値が戻されます。

⁄* CELEBL21

   This example illustrates the llroundd32() function.

*⁄

#pragma strings(readonly)

#define __STDC_WANT_DEC_FP__
#include <fenv.h>
#include <math.h>
#include <stdio.h>

static void try_rm(int, _Decimal32);

⁄* pass back printable rounding mode *⁄

static
char *rm_str(int rm)
{
  char *s = "undetermined";

  switch (rm)
  {
    case    FE_DEC_TONEAREST            :
      s =  "FE_DEC_TONEAREST"           ;  break;
    case    FE_DEC_TOWARDZERO           :
      s =  "FE_DEC_TOWARDZERO"          ;  break;
    case    FE_DEC_UPWARD               :
      s =  "FE_DEC_UPWARD"              ;  break;
    case    FE_DEC_DOWNWARD             :
      s =  "FE_DEC_DOWNWARD"            ;  break;
    case    FE_DEC_TONEARESTFROMZERO    :
      s =  "FE_DEC_TONEARESTFROMZERO"   ;  break;
    case   _FE_DEC_TONEARESTTOWARDZERO  :
      s = "_FE_DEC_TONEARESTTOWARDZERO" ;  break;
    case   _FE_DEC_AWAYFROMZERO         :
      s = "_FE_DEC_AWAYFROMZERO"        ;  break;
    case   _FE_DEC_PREPAREFORSHORTER    :
      s = "_FE_DEC_PREPAREFORSHORTER"   ;  break;
   }

   return s;
}


⁄* Try out one passed-in number with rounding mode *⁄

static void try_rm(int rm, _Decimal32 d32)
{
  long long int ll;

  (void)fe_dec_setround(rm);

  ll = llroundd32(d32);

  printf("llroundd32(%+.2HF)  = %+lld - rounding mode = %s¥n",
         d32 , ll, rm_str(rm)
        );
  return;
}


int main()
{
  try_rm( FE_DEC_TONEAREST          ,  501.50DF);
  try_rm( FE_DEC_TOWARDZERO         ,  501.50DF);
  try_rm( FE_DEC_UPWARD             , -501.51DF);
  try_rm( FE_DEC_DOWNWARD           , -501.49DF);
  try_rm( FE_DEC_TONEARESTFROMZERO  ,  500.50DF);
  try_rm(_FE_DEC_TONEARESTTOWARDZERO, -501.50DF);
  try_rm(_FE_DEC_AWAYFROMZERO       ,  500.49DF);
  try_rm(_FE_DEC_PREPAREFORSHORTER  ,  501.50DF);

  return 0;
}

関連情報