[BACK]Return to random.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / mpfr

Annotation of OpenXM_contrib/gmp/mpfr/random.c, Revision 1.1

1.1     ! maekawa     1: /* mpfr_random -- generate a random floating-point number
        !             2:
        !             3: Copyright (C) 1999 PolKA project, Inria Lorraine and Loria
        !             4:
        !             5: This file is part of the MPFR Library.
        !             6:
        !             7: The MPFR Library is free software; you can redistribute it and/or modify
        !             8: it under the terms of the GNU Library General Public License as published by
        !             9: the Free Software Foundation; either version 2 of the License, or (at your
        !            10: option) any later version.
        !            11:
        !            12: The MPFR Library is distributed in the hope that it will be useful, but
        !            13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14: or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
        !            15: License for more details.
        !            16:
        !            17: You should have received a copy of the GNU Library General Public License
        !            18: along with the MPFR Library; see the file COPYING.LIB.  If not, write to
        !            19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
        !            20: MA 02111-1307, USA. */
        !            21:
        !            22: #include <stdio.h>
        !            23: #include "gmp.h"
        !            24: #include "gmp-impl.h"
        !            25: #include "longlong.h"
        !            26: #include "mpfr.h"
        !            27:
        !            28: /* Computes a random mpfr in [0, 1[ with precision PREC */
        !            29:
        !            30: extern long random _PROTO((void));
        !            31: extern int srandom _PROTO((unsigned int));
        !            32:
        !            33: /* extracted from GNU mpf */
        !            34: #if defined (__hpux) || defined (__alpha)
        !            35: /* HPUX lacks random().  DEC OSF/1 1.2 random() returns a double.  */
        !            36: #define random mrand48
        !            37: #define srandom srand48
        !            38: #endif
        !            39:
        !            40: void
        !            41: #if __STDC__
        !            42: mpfr_random(mpfr_ptr x)
        !            43: #else
        !            44: mpfr_random(x)
        !            45:      mpfr_ptr x;
        !            46: #endif
        !            47: {
        !            48:   mp_limb_t *xp; unsigned long xn, i, cnt, prec=PREC(x);
        !            49:
        !            50:   xp = MANT(x);
        !            51:   xn = (prec-1)/BITS_PER_MP_LIMB + 1;
        !            52:
        !            53:   for (i = 0; i < xn; i++)
        !            54:     {
        !            55:       /* random() c/sh/ould be replaced by a homemade random number generator.
        !            56:         Indeed, if on Linux random is a good RNG, this is definitely not
        !            57:         the case in most Un*xes. */
        !            58:       xp[i] = random();
        !            59:     }
        !            60:
        !            61:   count_leading_zeros(cnt, xp[xn - 1]);
        !            62:   if (cnt) mpn_lshift(xp, xp, xn, cnt);
        !            63:   EXP(x) = -cnt;
        !            64:
        !            65:   cnt = xn*BITS_PER_MP_LIMB - prec;
        !            66:   /* cnt is the number of non significant bits in the low limb */
        !            67:   xp[0] &= ~((((mp_limb_t)1)<<cnt) - 1);
        !            68: }
        !            69:
        !            70: void
        !            71: mpfr_srandom(unsigned long seed)
        !            72: {
        !            73:   srandom(seed);
        !            74: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>