对于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"但都没有效果。
答案 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)
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;
}