mpfr_set_str不具备良好的价值

时间:2018-05-09 11:43:11

标签: c mpfr

对于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

它显然不是同一个价值......但我不知道为什么?

我无法使用The GNU Multiple Precision Arithmetic Library因为我需要MPFR的功能,例如" log"和" exp"。

我也尝试使用不同的舍入模式代替" MPFR_RNDN"但都没有效果。

2 个答案:

答案 0 :(得分:0)

这三个mpfr_printf语句都是等效的。 (我假设你得到了from here

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

舍入到最接近的值(默认值)

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

舍入到最近(因为“RN”)

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

舍入到最近(因为“MPFR_RNDN”)

答案 1 :(得分:0)

来自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;
}