mpfr_set_str не дают хорошего значения - PullRequest
0 голосов
/ 09 мая 2018

Для проекта на C я пытаюсь использовать GNU MPFR Library .

Но я не понимаю, как работает функция mpfr_printf .

Например, для кода:

mpfr_t x;
mpfr_init( x );
mpfr_set_str( x, "213598703592091008239502270499962879705109534182641740644", 10, MPFR_RNDN);
mpfr_printf( "%.0RF\n", x );
mpfr_printf( "%.0RNf\n", x );
mpfr_printf( "%.0R*f\n", MPFR_RNDN, x );

Показать для всех mpfr_printf значение 213598703592090993136552875701722213572989498633163374592

Это явно не то же самое значение ... но я не знаю почему?

Я не могу использовать Многофункциональную арифметическую библиотеку GNU , потому что мне нужны такие функции MPFR, как "log" и "exp".

Я также пробовал разные Режимы округления вместо "MPFR_RNDN", но ни один не работает.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

С GNU MPFR 4.0.1 :

 A floating-point number, or float for short, is an arbitrary precision
 significand (also called mantissa) with a **limited** precision exponent.
 The C data type for such objects is mpfr_t
 ....
 The precision is the **number of bits used to represent the significand**
 of a floating-point number;...

Числа 'mpfr' представлены как float и имеют точность. Вы можете прочитать о точности чисел с плавающей запятой (количество бит в значащем) на wiki .

Каждый mpfr должен быть инициализирован с точностью до пользователя. mpfr_init инициализированное число с точностью по умолчанию. Из руководства: The default precision is set to 53 bits initially. Используйте функцию mpfr_init2, чтобы установить точность (старайтесь использовать ее всегда). Следующее будет работать как положено, однако вам может не хватить памяти:

int main()
{
    mpfr_t x;
    mpfr_init2(x, 200);
    mpfr_set_str( x, "213598703592091008239502270499962879705109534182641740644", 10, MPFR_RNDN);
    mpfr_printf( "%.0RF\n", x );
    mpfr_printf( "%.0RNf\n", x );
    mpfr_printf( "%.0R*f\n", MPFR_RNDN, x );
    return 0;
}
0 голосов
/ 09 мая 2018

Все три из этих операторов mpfr_printf эквивалентны. (Я полагаю, вы получили их отсюда )

mpfr_printf( "%.0RF\n", x );

Округление до ближайшего значения (по умолчанию)

mpfr_printf( "%.0RNf\n", x );

Округляет до ближайшего (потому что "RN")

mpfr_printf( "%.0R*f\n", MPFR_RNDN, x );

Округляет до ближайшего (потому что "MPFR_RNDN")

...