Home | History | Annotate | Line # | Download | only in src
      1 /* radius -- Functions for radii of complex balls.
      2 
      3 Copyright (C) 2022 INRIA
      4 
      5 This file is part of GNU MPC.
      6 
      7 GNU MPC is free software; you can redistribute it and/or modify it under
      8 the terms of the GNU Lesser General Public License as published by the
      9 Free Software Foundation; either version 3 of the License, or (at your
     10 option) any later version.
     11 
     12 GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
     13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
     14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
     15 more details.
     16 
     17 You should have received a copy of the GNU Lesser General Public License
     18 along with this program. If not, see http://www.gnu.org/licenses/ .
     19 */
     20 
     21 #include <math.h>
     22 #include <inttypes.h> /* for the PRIi64 format modifier */
     23 #include <stdio.h>    /* for FILE */
     24 #include "mpc-impl.h"
     25 
     26 #define MPCR_MANT(r) ((r)->mant)
     27 #define MPCR_EXP(r) ((r)->exp)
     28 #define MPCR_MANT_MIN (((int64_t) 1) << 30)
     29 #define MPCR_MANT_MAX (MPCR_MANT_MIN << 1)
     30 
     31 /* The radius can take three types of values, represented as follows:
     32    infinite: the mantissa is -1 and the exponent is undefined;
     33    0: the mantissa and the exponent are 0;
     34    positive: the mantissa is a positive integer, and the radius is
     35    mantissa*2^exponent. A normalised positive radius "has 31 bits",
     36    in the sense that the bits 0 to 29 are arbitrary, bit 30 is 1,
     37    and bits 31 to 63 are 0; otherwise said, the mantissa lies between
     38    2^30 and 2^31-1.
     39    Unless stated otherwise, all functions take normalised inputs and
     40    produce normalised output; they compute only upper bounds on the radii,
     41    without guaranteeing that these are tight. */
     42 
     43 
     44 static void mpcr_add_one_ulp (mpcr_ptr r)
     45    /* Add 1 to the mantissa of the normalised r and renormalise. */
     46 {
     47    MPCR_MANT (r)++;
     48    if (MPCR_MANT (r) == MPCR_MANT_MAX) {
     49       MPCR_MANT (r) >>= 1;
     50       MPCR_EXP (r)++;
     51    }
     52 }
     53 
     54 
     55 static unsigned int leading_bit (int64_t n)
     56    /* Assuming that n is a positive integer, return the position
     57       (from 0 to 62) of the leading bit, that is, the k such that
     58       n >= 2^k, but n < 2^(k+1). */
     59 {
     60    unsigned int k;
     61 
     62    if (n & (((uint64_t) 0x7fffffff) << 32))
     63       if (n & (((uint64_t) 0x7fff) << 48))
     64          if (n & (((uint64_t) 0x7f) << 56))
     65             if (n & (((uint64_t) 0x7) << 60))
     66                if (n & (((uint64_t) 0x1) << 62))
     67                   k = 62;
     68                else
     69                   if (n & (((uint64_t) 0x1) << 61))
     70                      k = 61;
     71                   else
     72                      k = 60;
     73             else
     74                if (n & (((uint64_t) 0x3) << 58))
     75                   if (n & (((uint64_t) 0x1) << 59))
     76                      k = 59;
     77                   else
     78                      k = 58;
     79                else
     80                   if (n & (((uint64_t) 0x1) << 57))
     81                      k = 57;
     82                   else
     83                      k = 56;
     84          else
     85             if (n & (((uint64_t) 0xf) << 52))
     86                if (n & (((uint64_t) 0x3) << 54))
     87                   if (n & (((uint64_t) 0x1) << 55))
     88                      k = 55;
     89                   else
     90                      k = 54;
     91                else
     92                   if (n & (((uint64_t) 0x1) << 53))
     93                      k = 53;
     94                   else
     95                      k = 52;
     96             else
     97                if (n & (((uint64_t) 0x3) << 50))
     98                   if (n & (((uint64_t) 0x1) << 51))
     99                      k = 51;
    100                   else
    101                      k = 50;
    102                else
    103                   if (n & (((uint64_t) 0x1) << 49))
    104                      k = 49;
    105                   else
    106                      k = 48;
    107       else
    108          if (n & (((uint64_t) 0xff) << 40))
    109             if (n & (((uint64_t) 0xf) << 44))
    110                if (n & (((uint64_t) 0x3) << 46))
    111                   if (n & (((uint64_t) 0x1) << 47))
    112                      k = 47;
    113                   else
    114                      k = 46;
    115                else
    116                   if (n & (((uint64_t) 0x1) << 45))
    117                      k = 45;
    118                   else
    119                      k = 44;
    120             else
    121                if (n & (((uint64_t) 0x3) << 42))
    122                   if (n & (((uint64_t) 0x1) << 43))
    123                      k = 43;
    124                   else
    125                      k = 42;
    126                else
    127                   if (n & (((uint64_t) 0x1) << 41))
    128                      k = 41;
    129                   else
    130                      k = 40;
    131          else
    132             if (n & (((uint64_t) 0xf) << 36))
    133                if (n & (((uint64_t) 0x3) << 38))
    134                   if (n & (((uint64_t) 0x1) << 39))
    135                      k = 39;
    136                   else
    137                      k = 38;
    138                else
    139                   if (n & (((uint64_t) 0x1) << 37))
    140                      k = 37;
    141                   else
    142                      k = 36;
    143             else
    144                if (n & (((uint64_t) 0x3) << 34))
    145                   if (n & (((uint64_t) 0x1) << 35))
    146                      k = 35;
    147                   else
    148                      k = 34;
    149                else
    150                   if (n & (((uint64_t) 0x1) << 33))
    151                      k = 33;
    152                   else
    153                      k = 32;
    154    else
    155       if (n & (((uint64_t) 0xffff) << 16))
    156          if (n & (((uint64_t) 0xff) << 24))
    157             if (n & (((uint64_t) 0xf) << 28))
    158                if (n & (((uint64_t) 0x3) << 30))
    159                   if (n & (((uint64_t) 0x1) << 31))
    160                      k = 31;
    161                   else
    162                      k = 30;
    163                else
    164                   if (n & (((uint64_t) 0x1) << 29))
    165                      k = 29;
    166                   else
    167                      k = 28;
    168             else
    169                if (n & (((uint64_t) 0x3) << 26))
    170                   if (n & (((uint64_t) 0x1) << 27))
    171                      k = 27;
    172                   else
    173                      k = 26;
    174                else
    175                   if (n & (((uint64_t) 0x1) << 25))
    176                      k = 25;
    177                   else
    178                      k = 24;
    179          else
    180             if (n & (((uint64_t) 0xf) << 20))
    181                if (n & (((uint64_t) 0x3) << 22))
    182                   if (n & (((uint64_t) 0x1) << 23))
    183                      k = 23;
    184                   else
    185                      k = 22;
    186                else
    187                   if (n & (((uint64_t) 0x1) << 21))
    188                      k = 21;
    189                   else
    190                      k = 20;
    191             else
    192                if (n & (((uint64_t) 0x3) << 18))
    193                   if (n & (((uint64_t) 0x1) << 19))
    194                      k = 19;
    195                   else
    196                      k = 18;
    197                else
    198                   if (n & (((uint64_t) 0x1) << 17))
    199                      k = 17;
    200                   else
    201                      k = 16;
    202       else
    203          if (n & (((uint64_t) 0xff) << 8))
    204             if (n & (((uint64_t) 0xf) << 12))
    205                if (n & (((uint64_t) 0x3) << 14))
    206                   if (n & (((uint64_t) 0x1) << 15))
    207                      k = 15;
    208                   else
    209                      k = 14;
    210                else
    211                   if (n & (((uint64_t) 0x1) << 13))
    212                      k = 13;
    213                   else
    214                      k = 12;
    215             else
    216                if (n & (((uint64_t) 0x3) << 10))
    217                   if (n & (((uint64_t) 0x1) << 11))
    218                      k = 11;
    219                   else
    220                      k = 10;
    221                else
    222                   if (n & (((uint64_t) 0x1) << 9))
    223                      k = 9;
    224                   else
    225                      k = 8;
    226          else
    227             if (n & (((uint64_t) 0xf) << 4))
    228                if (n & (((uint64_t) 0x3) << 6))
    229                   if (n & (((uint64_t) 0x1) << 7))
    230                      k = 7;
    231                   else
    232                      k = 6;
    233                else
    234                   if (n & (((uint64_t) 0x1) << 5))
    235                      k = 5;
    236                   else
    237                      k = 4;
    238             else
    239                if (n & (((uint64_t) 0x3) << 2))
    240                   if (n & (((uint64_t) 0x1) << 3))
    241                      k = 3;
    242                   else
    243                      k = 2;
    244                else
    245                   if (n & (((uint64_t) 0x1) << 1))
    246                      k = 1;
    247                   else
    248                      k = 0;
    249 
    250    return k;
    251 }
    252 
    253 
    254 static void mpcr_normalise_rnd (mpcr_ptr r, mpfr_rnd_t rnd)
    255    /* The function computes a normalised value for the potentially
    256       unnormalised r; depending on whether rnd is MPFR_RNDU or MPFR_RNDD,
    257       the result is rounded up or down. For efficiency reasons, rounding
    258       up does not take exact cases into account and adds one ulp anyway. */
    259 {
    260    unsigned int k;
    261 
    262    if (mpcr_zero_p (r))
    263       MPCR_EXP (r) = 0;
    264    else if (!mpcr_inf_p (r)) {
    265       k = leading_bit (MPCR_MANT (r));
    266       if (k <= 30) {
    267          MPCR_MANT (r) <<= 30 - k;
    268          MPCR_EXP (r) -= 30 - k;
    269       }
    270       else {
    271          MPCR_MANT (r) >>= k - 30;
    272          MPCR_EXP (r) += k - 30;
    273          if (rnd == MPFR_RNDU)
    274             mpcr_add_one_ulp (r);
    275       }
    276    }
    277 }
    278 
    279 
    280 static void mpcr_normalise (mpcr_ptr r)
    281    /* The potentially unnormalised r is normalised with rounding up. */
    282 {
    283    mpcr_normalise_rnd (r, MPFR_RNDU);
    284 }
    285 
    286 
    287 int mpcr_inf_p (mpcr_srcptr r)
    288 {
    289    return MPCR_MANT (r) == -1;
    290 }
    291 
    292 
    293 int mpcr_zero_p (mpcr_srcptr r)
    294 {
    295    return MPCR_MANT (r) == 0;
    296 }
    297 
    298 
    299 int mpcr_lt_half_p (mpcr_srcptr r)
    300    /* Return true if r < 1/2, false otherwise. */
    301 {
    302    return mpcr_zero_p (r) || MPCR_EXP (r) < -31;
    303 }
    304 
    305 
    306 int mpcr_cmp (mpcr_srcptr r, mpcr_srcptr s)
    307 {
    308    if (mpcr_inf_p (r))
    309       if (mpcr_inf_p (s))
    310          return 0;
    311       else
    312          return +1;
    313    else if (mpcr_inf_p (s))
    314       return -1;
    315    else if (mpcr_zero_p (r))
    316       if (mpcr_zero_p (s))
    317          return 0;
    318       else
    319          return -1;
    320    else if (mpcr_zero_p (s))
    321       return +1;
    322    else if (MPCR_EXP (r) > MPCR_EXP (s))
    323       return +1;
    324    else if (MPCR_EXP (r) < MPCR_EXP (s))
    325       return -1;
    326    else if (MPCR_MANT (r) > MPCR_MANT (s))
    327       return +1;
    328    else if (MPCR_MANT (r) < MPCR_MANT (s))
    329       return -1;
    330    else
    331       return 0;
    332 }
    333 
    334 
    335 void mpcr_set_inf (mpcr_ptr r)
    336 {
    337    MPCR_MANT (r) = -1;
    338 }
    339 
    340 
    341 void mpcr_set_zero (mpcr_ptr r)
    342 {
    343    MPCR_MANT (r) = 0;
    344    MPCR_EXP (r) = 0;
    345 }
    346 
    347 
    348 void mpcr_set_one (mpcr_ptr r)
    349 {
    350    MPCR_MANT (r) = ((int64_t) 1) << 30;
    351    MPCR_EXP (r) = -30;
    352 }
    353 
    354 
    355 void mpcr_set (mpcr_ptr r, mpcr_srcptr s)
    356 {
    357    r [0] = s [0];
    358 }
    359 
    360 
    361 void mpcr_set_ui64_2si64 (mpcr_ptr r, uint64_t mant, int64_t exp)
    362    /* Set r to mant*2^exp, rounded up. */
    363 {
    364    if (mant == 0)
    365       mpcr_set_zero (r);
    366    else {
    367       if (mant >= ((uint64_t) 1) << 63) {
    368          if (mant % 2 == 0)
    369             mant = mant / 2;
    370          else
    371             mant = mant / 2 + 1;
    372          exp++;
    373       }
    374       MPCR_MANT (r) = (int64_t) mant;
    375       MPCR_EXP (r) = exp;
    376       mpcr_normalise (r);
    377    }
    378 }
    379 
    380 
    381 void mpcr_max (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t)
    382    /* Set r to the maximum of s and t. */
    383 {
    384    if (mpcr_inf_p (s) || mpcr_inf_p (t))
    385       mpcr_set_inf (r);
    386    else if (mpcr_zero_p (s))
    387       mpcr_set (r, t);
    388    else if (mpcr_zero_p (t))
    389       mpcr_set (r, s);
    390    else if (MPCR_EXP (s) < MPCR_EXP (t))
    391       mpcr_set (r, t);
    392    else if (MPCR_EXP (s) > MPCR_EXP (t))
    393       mpcr_set (r, s);
    394    else if (MPCR_MANT (s) < MPCR_MANT (t))
    395       mpcr_set (r, t);
    396    else
    397       mpcr_set (r, s);
    398 }
    399 
    400 
    401 int64_t mpcr_get_exp (mpcr_srcptr r)
    402    /* Return the exponent e such that r = m * 2^e with m such that
    403       0.5 <= m < 1. */
    404 {
    405    return MPCR_EXP (r) + 31;
    406 }
    407 
    408 void mpcr_out_str (FILE *f, mpcr_srcptr r)
    409 {
    410    if (mpcr_inf_p (r))
    411       fprintf (f, "");
    412    else if (mpcr_zero_p (r))
    413       fprintf (f, "0");
    414    else {
    415       fprintf (f, "(%" PRIi64 ", %" PRIi64 ")", MPCR_MANT (r), MPCR_EXP (r));
    416    }
    417 }
    418 
    419 static void mpcr_mul_rnd (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t,
    420     mpfr_rnd_t rnd)
    421     /* Set r to the product of s and t, rounded according to whether rnd
    422        is MPFR_RNDU or MPFR_RNDD. */
    423 {
    424    if (mpcr_inf_p (s) || mpcr_inf_p (t))
    425       mpcr_set_inf (r);
    426    else if (mpcr_zero_p (s) || mpcr_zero_p (t))
    427       mpcr_set_zero (r);
    428    else {
    429       MPCR_MANT (r) = MPCR_MANT (s) * MPCR_MANT (t);
    430       MPCR_EXP (r) = MPCR_EXP (s) + MPCR_EXP (t);
    431       mpcr_normalise_rnd (r, rnd);
    432    }
    433 }
    434 
    435 
    436 void mpcr_mul (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t)
    437 {
    438    mpcr_mul_rnd (r, s, t, MPFR_RNDU);
    439 }
    440 
    441 
    442 void mpcr_mul_2ui (mpcr_ptr r, mpcr_srcptr s, unsigned long int e)
    443 {
    444    if (mpcr_inf_p (s))
    445       mpcr_set_inf (r);
    446    else if (mpcr_zero_p (s))
    447       mpcr_set_zero (r);
    448    else {
    449       MPCR_MANT (r) = MPCR_MANT (s);
    450       MPCR_EXP (r) = MPCR_EXP (s) + (int64_t) e;
    451    }
    452 }
    453 
    454 
    455 void mpcr_sqr (mpcr_ptr r, mpcr_srcptr s)
    456 {
    457    mpcr_mul_rnd (r, s, s, MPFR_RNDU);
    458 }
    459 
    460 
    461 static void mpcr_add_rnd (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t,
    462    mpfr_rnd_t rnd)
    463     /* Set r to the sum of s and t, rounded according to whether rnd
    464        is MPFR_RNDU or MPFR_RNDD.
    465        The function also works correctly for certain non-normalised
    466        arguments s and t as long as the sum of their (potentially shifted
    467        if the exponents are not the same) mantissae does not flow over into
    468        the sign bit of the resulting mantissa. This is in particular the
    469        case when the mantissae of s and t start with the bits 00, that is,
    470        are less than 2^62, for instance because they are the results of
    471        multiplying two normalised mantissae together, so that an fmma
    472        function can be implemented without intermediate normalisation of
    473        the products. */
    474 {
    475    int64_t d;
    476 
    477    if (mpcr_inf_p (s) || mpcr_inf_p (t))
    478       mpcr_set_inf (r);
    479    else if (mpcr_zero_p (s))
    480       mpcr_set (r, t);
    481    else if (mpcr_zero_p (t))
    482       mpcr_set (r, s);
    483    else {
    484       /* Now all numbers are finite and non-zero. */
    485       d = MPCR_EXP (s) - MPCR_EXP (t);
    486       if (d >= 0) {
    487          if (d >= 64)
    488             /* Shifting by more than the bitlength of the type may cause
    489                compiler warnings and run time errors. */
    490             MPCR_MANT (r) = MPCR_MANT (s);
    491          else
    492             MPCR_MANT (r) = MPCR_MANT (s) + (MPCR_MANT (t) >> d);
    493          MPCR_EXP (r) = MPCR_EXP (s);
    494       }
    495       else {
    496          if (d <= -64)
    497             MPCR_MANT (r) = MPCR_MANT (t);
    498          else
    499             MPCR_MANT (r) = MPCR_MANT (t) + (MPCR_MANT (s) >> (-d));
    500          MPCR_EXP (r) = MPCR_EXP (t);
    501       }
    502       if (rnd == MPFR_RNDU)
    503          MPCR_MANT (r)++;
    504       mpcr_normalise_rnd (r, rnd);
    505    }
    506 }
    507 
    508 
    509 void mpcr_add (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t)
    510 {
    511    mpcr_add_rnd (r, s, t, MPFR_RNDU);
    512 }
    513 
    514 
    515 void mpcr_sub_rnd (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t, mpfr_rnd_t rnd)
    516    /* Set r to s - t, rounded according to whether rnd is MPFR_RNDU or
    517        MPFR_RNDD; if the result were negative, it is set to infinity. */
    518 {
    519    int64_t d;
    520    int cmp;
    521 
    522    cmp = mpcr_cmp (s, t);
    523    if (mpcr_inf_p (s) || mpcr_inf_p (t) || cmp < 0)
    524       mpcr_set_inf (r);
    525    else if (cmp == 0)
    526       mpcr_set_zero (r);
    527    else if (mpcr_zero_p (t))
    528       mpcr_set (r, s);
    529    else {
    530       /* Now all numbers are positive and normalised, and s > t. */
    531       d = MPCR_EXP (s) - MPCR_EXP (t);
    532       if (d >= 64)
    533          MPCR_MANT (r) = MPCR_MANT (s);
    534       else
    535          MPCR_MANT (r) = MPCR_MANT (s) - (MPCR_MANT (t) >> d);
    536       MPCR_EXP (r) = MPCR_EXP (s);
    537       if (rnd == MPFR_RNDD)
    538          MPCR_MANT (r)--;
    539       mpcr_normalise_rnd (r, rnd);
    540    }
    541 }
    542 
    543 
    544 void mpcr_sub (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t)
    545 {
    546    mpcr_sub_rnd (r, s, t, MPFR_RNDU);
    547 }
    548 
    549 
    550 void mpcr_div (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t)
    551 {
    552    if (mpcr_inf_p (s) || mpcr_inf_p (t) || mpcr_zero_p (t))
    553       mpcr_set_inf (r);
    554    else if (mpcr_zero_p (s))
    555       mpcr_set_zero (r);
    556    else {
    557       MPCR_MANT (r) = (MPCR_MANT (s) << 32) / MPCR_MANT (t) + 1;
    558       MPCR_EXP (r) = MPCR_EXP (s) - 32 - MPCR_EXP (t);
    559       mpcr_normalise (r);
    560    }
    561 }
    562 
    563 
    564 void mpcr_div_2ui (mpcr_ptr r, mpcr_srcptr s, unsigned long int e)
    565 {
    566    if (mpcr_inf_p (s))
    567       mpcr_set_inf (r);
    568    else if (mpcr_zero_p (s))
    569       mpcr_set_zero (r);
    570    else {
    571       MPCR_MANT (r) = MPCR_MANT (s);
    572       MPCR_EXP (r) = MPCR_EXP (s) - (int64_t) e;
    573    }
    574 }
    575 
    576 
    577 int64_t sqrt_int64 (int64_t n)
    578    /* Assuming that 2^30 <= n < 2^32, return ceil (sqrt (n*2^30)). */
    579 {
    580    uint64_t N, s, t;
    581    int i;
    582 
    583    /* We use the "Babylonian" method to compute an integer square root of N;
    584       replacing the geometric mean sqrt (N) = sqrt (s * N/s) by the
    585       arithmetic mean (s + N/s) / 2, rounded up, we obtain an upper bound
    586       on the square root. */
    587    N = ((uint64_t) n) << 30;
    588    s = ((uint64_t) 1) << 31;
    589    for (i = 0; i < 5; i++) {
    590       t = s << 1;
    591       s = (s * s + N + t - 1) / t;
    592    }
    593 
    594    /* Exhaustive search over all possible values of n shows that with
    595       6 or more iterations, the method computes ceil (sqrt (N)) except
    596       for squares N, where it stabilises on sqrt (N) + 1.
    597       So we need to add a check for s-1; it turns out that then
    598       5 iterations are enough. */
    599    if ((s - 1) * (s - 1) >= N)
    600       return s - 1;
    601    else
    602       return s;
    603 }
    604 
    605 
    606 static void mpcr_sqrt_rnd (mpcr_ptr r, mpcr_srcptr s, mpfr_rnd_t rnd)
    607     /* Set r to the square root of s, rounded according to whether rnd is
    608        MPFR_RNDU or MPFR_RNDD. */
    609 {
    610    if (mpcr_inf_p (s))
    611       mpcr_set_inf (r);
    612    else if (mpcr_zero_p (s))
    613       mpcr_set_zero (r);
    614    else {
    615       if (MPCR_EXP (s) % 2 == 0) {
    616          MPCR_MANT (r) = sqrt_int64 (MPCR_MANT (s));
    617          MPCR_EXP (r) = MPCR_EXP (s) / 2 - 15;
    618       }
    619       else {
    620          MPCR_MANT (r) = sqrt_int64 (2 * MPCR_MANT (s));
    621          MPCR_EXP (r) = (MPCR_EXP (s) - 1) / 2 - 15;
    622       }
    623       /* Now we have 2^30 <= r < 2^31, so r is normalised;
    624          if r == 2^30, then furthermore the square root was exact,
    625          so we do not need to subtract 1 ulp when rounding down and
    626          preserve normalisation. */
    627       if (rnd == MPFR_RNDD && MPCR_MANT (r) != ((int64_t) 1) << 30)
    628          MPCR_MANT (r)--;
    629    }
    630 }
    631 
    632 
    633 void mpcr_sqrt (mpcr_ptr r, mpcr_srcptr s)
    634 {
    635    mpcr_sqrt_rnd (r, s, MPFR_RNDU);
    636 }
    637 
    638 
    639 static void mpcr_set_d_rnd (mpcr_ptr r, double d, mpfr_rnd_t rnd)
    640    /* Assuming that d is a positive double, set r to d rounded according
    641       to rnd, which can be one of MPFR_RNDU or MPFR_RNDD. */
    642 {
    643    double frac;
    644    int e;
    645 
    646    frac = frexp (d, &e);
    647    MPCR_MANT (r) = (int64_t) (frac * (((int64_t) 1) << 53));
    648    MPCR_EXP (r) = e - 53;
    649    mpcr_normalise_rnd (r, rnd);
    650 }
    651 
    652 
    653 static void mpcr_f_abs_rnd (mpcr_ptr r, mpfr_srcptr z, mpfr_rnd_t rnd)
    654    /* Set r to the absolute value of z, rounded according to rnd, which
    655       can be one of MPFR_RNDU or MPFR_RNDD. */
    656 {
    657    double d;
    658    int neg;
    659 
    660    neg = mpfr_cmp_ui (z, 0);
    661    if (neg == 0)
    662       mpcr_set_zero (r);
    663    else {
    664       if (rnd == MPFR_RNDU)
    665          d = mpfr_get_d (z, MPFR_RNDA);
    666       else
    667          d = mpfr_get_d (z, MPFR_RNDZ);
    668       if (d < 0)
    669          d = -d;
    670       mpcr_set_d_rnd (r, d, rnd);
    671    }
    672 }
    673 
    674 
    675 void mpcr_add_rounding_error (mpcr_ptr r, mpfr_prec_t p, mpfr_rnd_t rnd)
    676    /* Replace r, radius of a complex ball, by the new radius obtained after
    677       rounding both parts of the centre of the ball in direction rnd at
    678       precision t.
    679       Otherwise said:
    680       r += ldexp (1 + r, -p) for rounding to nearest, adding 0.5ulp;
    681       r += ldexp (1 + r, 1-p) for directed rounding, adding 1ulp.
    682    */
    683 {
    684    mpcr_t s;
    685 
    686    mpcr_set_one (s);
    687    mpcr_add (s, s, r);
    688    if (rnd == MPFR_RNDN)
    689       mpcr_div_2ui (s, s, p);
    690    else
    691       mpcr_div_2ui (s, s, p-1);
    692    mpcr_add (r, r, s);
    693 }
    694 
    695 
    696 void mpcr_c_abs_rnd (mpcr_ptr r, mpc_srcptr z, mpfr_rnd_t rnd)
    697     /* Compute a bound on mpc_abs (z) in r.
    698        rnd can take either of the values MPFR_RNDU and MPFR_RNDD, and
    699        the function computes an upper or a lower bound, respectively. */
    700 {
    701    mpcr_t re, im, u;
    702 
    703    mpcr_f_abs_rnd (re, mpc_realref (z), rnd);
    704    mpcr_f_abs_rnd (im, mpc_imagref (z), rnd);
    705 
    706    if (mpcr_zero_p (re))
    707       mpcr_set (r, im);
    708    else if (mpcr_zero_p (im))
    709       mpcr_set (r, re);
    710    else {
    711       /* Squarings can be done exactly. */
    712       MPCR_MANT (u) = MPCR_MANT (re) * MPCR_MANT (re);
    713       MPCR_EXP (u) = 2 * MPCR_EXP (re);
    714       MPCR_MANT (r) = MPCR_MANT (im) * MPCR_MANT (im);
    715       MPCR_EXP (r) = 2 * MPCR_EXP (im);
    716       /* Additions still fit. */
    717       mpcr_add_rnd (r, r, u, rnd);
    718       mpcr_sqrt_rnd (r, r, rnd);
    719    }
    720 }
    721 
    722