上下文:C 标准有
xxx_DECIMAL_DIG
宏,可以在 printf
到 maintain precision of floating-point value
中使用。 double
的示例:
printf("%.*g\n", DBL_DECIMAL_DIG, x);
一个简单的问题:如何根据
DECIMAL_DIG
返回的值计算相似的 mpfr_get_prec
?
示例:
#include <stdio.h>
#include <mpfr.h>
#define PREC 128
int prec2decimal_dig(int prec)
{
return prec / 3; // example, not accurate
}
int main (void)
{
mpfr_t x;
mpfr_init2(x, PREC);
mpfr_set_d(x, 2.0 / 3.0, MPFR_RNDN);
mpfr_printf("%.*Rf", prec2decimal_dig(PREC), x);
return 0;
}
$ gcc t78a.c -lmpfr -lgmp -oa && ./a
0.666666666666666629659232512494781985878944
prec2decimal_dig
的具体实施是什么?
base-2: why DECIMAL_DIG - DIG == 2 or 3?
。
XXX_DECIMAL_DIG
源自:
'b',底座。示例:2、10、...
'p',显式或隐式编码的位数(以
b
为基数)。
当
b
是10的幂时:
XXX_DECIMAL_DIG = p * log10(b)
否则
XXX_DECIMAL_DIG = ceiling(1 + (p * log10(b)))
使用 28/93 表示略大于 log102 的分数。
常见示例
double
DBL_DECIMAL_DIG = ceil(1 + (53 * 28.0/93))
DBL_DECIMAL_DIG = 1 + ((53 * 28 + 92)/93))
DBL_DECIMAL_DIG = 17
int prec2decimal_dig(int prec) {
// To achieve ceiling vvvv
return 1 + ((prec * 28 + 92)/93)
}