MPFR を整数に変換する

erange flag の変化

MPFR を整数に変換したときに erange flag がどうなるか はっきりしなかったので簡単なプログラムで確認した。

ソースコード (convert_to_integer.c)

#include <stdio.h>
#include <mpfr.h>

void print_erange_flag () {
  if (mpfr_erangeflag_p()) {
    printf("erange flag is set.\n");
  } else {
    printf("erange flag is not set.\n");
  }
}

int main(int argc, char *argv[]) {
  long int p;
  mpfr_t a, b, c;
  mpfr_init(a);
  mpfr_init2(b, 128);
  mpfr_init2(c, 64);

  mpfr_set_str(a, "1.3e+10", 10, MPFR_RNDN);
  p = mpfr_get_si(a, MPFR_RNDN);
  mpfr_printf("a=%.Re, p=%ld\n", a, p);
  print_erange_flag();

  mpfr_set_str(b, "1.3e+30", 10, MPFR_RNDN);
  p = mpfr_get_si(b, MPFR_RNDN);
  mpfr_printf("b=%.Re, p=%ld\n", b, p);
  print_erange_flag();

  mpfr_set_str(c, "1.3e+5", 10, MPFR_RNDN);
  p = mpfr_get_si(c, MPFR_RNDN);
  mpfr_printf("c=%.Re, p=%ld\n", c, p);
  print_erange_flag();

  mpfr_clear_erangeflag ();
  print_erange_flag();
  
  mpfr_clear(a);
  mpfr_clear(b);
  mpfr_clear(c);
  return 0;
}

コンパイル

gcc convert_to_integer.c -o convert_to_integer -lmpfr

実行結果

$ ./convert_to_integer
a=1.3e+10, p=13000000000
erange flag is not set.
b=1.3e+30, p=9223372036854775807
erange flag is set.
c=1.3e+05, p=130000
erange flag is set.
erange flag is not set.

a は long int の範囲内なので erange flag はセットされない。 b は範囲を超えるので erange flag がセットされる。 c は範囲内だがすでに b のときに erange flag がセットされているので、 flag は変化しない。 mpfr_clear_erangeflag() を実行するとリセットされる。

mpfr_fits_slong_p で変換できるかどうかを確認する

mpfr_fits_slong_p が NaN に対して偽を返すことを確認した。

ソースコード (fits_slong.c)

#include <stdio.h>
#include <mpfr.h>

void print_fits_slong (mpfr_t a) {
  if (mpfr_fits_slong_p(a, MPFR_RNDN)) {
    printf("Fit.\n");
  } else {
    printf("Not fit.\n");
  }
}

int main(int argc, char *argv[]) {
  long int p;
  mpfr_t a, b;
  mpfr_init(a);
  mpfr_init(b);

  mpfr_set_nan(a);
  mpfr_set_str(b, "1.2345", 10, MPFR_RNDN);

  print_fits_slong(a);
  print_fits_slong(b);

  mpfr_clear(a);
  mpfr_clear(b);
  return 0;
}

コンパイル

gcc fits_slong.c -o fits_slong -lmpfr

実行結果

$ ./fits_slong
Not fit.
Fit.

Tags of current page

, ,