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.