如何根据 mpfr_get_prec() 返回的值计算 DECIMAL_DIG?

问题描述 投票:0回答:1

上下文: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?

floating-point precision mpfr
1个回答
0
投票

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.