将有理数的第 N 个根计算为正确舍入的浮点数

计算科学 数字 C 浮点 精确
2021-12-13 07:28:26

请原谅我的词汇量不足,因为我没有在这个领域接受过正规培训,这也是我问这个问题的原因——这可能是微不足道的,也可能是不可能的。

我想将以下形式的表达式评估为具有“正确”舍入的二进制浮点数,我担心双舍入会破坏我的结果:

abcaNb,cN>0

二进制浮点数主要是指普通的旧double,但由于我使用MPFR 它可以具有任何有限精度。

通过正确舍入,我的意思是好像完整的表达式被评估为无限精度,然后正确舍入,没有任何“双舍入”破坏结果的机会。

我使用MPFRGMP使用任意大小的整数和浮点数来处理这些表达式,到目前为止,我将工作分为两个步骤,四舍五入到中间更大的浮点数:

t=a/bt:e.g. binary128
y=tcy:e.g. binary64

使用 MPFR 我可以计算两者a/btc正确舍入到任意精度,但我不知道如何以保证完整表达式正确舍入的方式执行这两个步骤!

这是我目前正在做的代码示例。由于它是用 C 编写的,所以有点笨拙(没有重载或默认参数),但我希望即使您不精通这种语言或我使用的库,您也能看到这些步骤:

extern unsigned long int a, b, c;     // b and c != 0
MPFR_DECL_INIT( y, DBL_MANT_DIG    ); // Fits a double exactly
MPFR_DECL_INIT( t, DBL_MANT_DIG*2  ); // Twice the precision I want
mpfr_set_ui   ( t, a,    MPFR_RNDN ); // Exact conversion
mpfr_div_ui   ( t, t, b, MPFR_RNDN ); // Correctly rounded
mpfr_rootn_ui ( y, t, c, MPFR_RNDN ); // N'th root correctly rounded

我期待其中之一成立:

  • 中间精度的两倍还不够
  • 中间精度的两倍超过需要 - 我只需要 N 个额外的位
  • 我需要以不同的方式做,但在有限的时间和空间内仍然是可能的
  • 由于某种原因,无法保证正确的舍入
0个回答
没有发现任何回复~