Back to index

glibc  2.9
drand48-iter.c
Go to the documentation of this file.
00001 /* Copyright (C) 1995, 1996, 2001 Free Software Foundation, Inc.
00002    This file is part of the GNU C Library.
00003    Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
00004 
00005    The GNU C Library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009 
00010    The GNU C Library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014 
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with the GNU C Library; if not, write to the Free
00017    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00018    02111-1307 USA.  */
00019 
00020 #include <errno.h>
00021 #include <stdlib.h>
00022 #include <limits.h>
00023 #include <stdint.h>
00024 #include <sys/types.h>
00025 
00026 /* Global state for non-reentrant functions.  */
00027 struct drand48_data __libc_drand48_data;
00028 
00029 
00030 int
00031 __drand48_iterate (xsubi, buffer)
00032      unsigned short int xsubi[3];
00033      struct drand48_data *buffer;
00034 {
00035   uint64_t X;
00036   uint64_t result;
00037 
00038   /* Initialize buffer, if not yet done.  */
00039   if (__builtin_expect (!buffer->__init, 0))
00040     {
00041       buffer->__a = 0x5deece66dull;
00042       buffer->__c = 0xb;
00043       buffer->__init = 1;
00044     }
00045 
00046   /* Do the real work.  We choose a data type which contains at least
00047      48 bits.  Because we compute the modulus it does not care how
00048      many bits really are computed.  */
00049 
00050   X = (uint64_t) xsubi[2] << 32 | (uint32_t) xsubi[1] << 16 | xsubi[0];
00051 
00052   result = X * buffer->__a + buffer->__c;
00053 
00054   xsubi[0] = result & 0xffff;
00055   xsubi[1] = (result >> 16) & 0xffff;
00056   xsubi[2] = (result >> 32) & 0xffff;
00057 
00058   return 0;
00059 }