Efficiently computing (a - K) / (a + K) with improved accuracy

后端 未结 6 1763
抹茶落季
抹茶落季 2021-02-18 15:44

In various contexts, for example for the argument reduction for mathematical functions, one needs to compute (a - K) / (a + K), where a is a positive v

6条回答
  •  无人及你
    2021-02-18 16:13

    One possibility is to track error of m and p into m1 and p1 with classical Dekker/Schewchuk:

    m=a-k;
    k0=a-m;
    a0=k0+m;
    k1=k0-k;
    a1=a-a0;
    m1=a1+k1;
    
    p=a+k;
    k0=p-a;
    a0=p-k0;
    k1=k-k0;
    a1=a-a0;
    p1=a1+k1;
    

    Then, correct the naive division:

    q=m/p;
    r0=fmaf(p,-q,m);
    r1=fmaf(p1,-q,m1);
    r=r0+r1;
    q1=r/p;
    q=q+q1;
    

    That'll cost you 2 divisions, but should be near half ulp if I didn't screw up.

    But these divisions can be replaced by multiplications with inverse of p without any problem, since the first incorrectly rounded division will be compensated by remainder r, and second incorrectly rounded division does not really matter (the last bits of correction q1 won't change anything).

提交回复
热议问题