请原谅我的词汇量不足,因为我没有在这个领域接受过正规培训,这也是我问这个问题的原因——这可能是微不足道的,也可能是不可能的。
我想将以下形式的表达式评估为具有“正确”舍入的二进制浮点数,我担心双舍入会破坏我的结果:
二进制浮点数主要是指普通的旧double,但由于我使用MPFR ,它可以具有任何有限精度。
通过正确舍入,我的意思是好像完整的表达式被评估为无限精度,然后正确舍入,没有任何“双舍入”破坏结果的机会。
我使用MPFR和GMP使用任意大小的整数和浮点数来处理这些表达式,到目前为止,我将工作分为两个步骤,四舍五入到中间更大的浮点数:
使用 MPFR 我可以计算两者和正确舍入到任意精度,但我不知道如何以保证完整表达式正确舍入的方式执行这两个步骤!
这是我目前正在做的代码示例。由于它是用 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 个额外的位
- 我需要以不同的方式做,但在有限的时间和空间内仍然是可能的
- 由于某种原因,无法保证正确的舍入