1 | */* Copyright (C) 1995-2019 Free Software Foundation, Inc.* |

2 | * This file is part of the GNU C Library.* |

3 | * Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.* |

4 | |

5 | * The GNU C Library is free software; you can redistribute it and/or* |

6 | * modify it under the terms of the GNU Lesser General Public* |

7 | * License as published by the Free Software Foundation; either* |

8 | * version 2.1 of the License, or (at your option) any later version.* |

9 | |

10 | * The GNU C Library is distributed in the hope that it will be useful,* |

11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of* |

12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU* |

13 | * Lesser General Public License for more details.* |

14 | |

15 | * You should have received a copy of the GNU Lesser General Public* |

16 | * License along with the GNU C Library; if not, see* |

17 | * <http://www.gnu.org/licenses/>. */* |

18 | |

19 | __#include <ieee754.h>__ |

20 | __#include <stdlib.h>__ |

21 | __#include <limits.h>__ |

22 | |

23 | |

24 | *int* |

25 | __erand48_r (*unsigned* *short* *int* xsubi[`3`], **struct** drand48_data *buffer, |

26 | *double* *result) |

27 | { |

28 | **union** ieee754_double temp; |

29 | |

30 | */* Compute next state. */* |

31 | **if** (__drand48_iterate (xsubi, buffer) < `0`) |

32 | **return** -`1`; |

33 | |

34 | */* Construct a positive double with the 48 random bits distributed over* |

35 | * its fractional part so the resulting FP number is [0.0,1.0). */* |

36 | |

37 | temp.ieee.negative = `0`; |

38 | temp.ieee.exponent = IEEE754_DOUBLE_BIAS; |

39 | temp.ieee.mantissa0 = (xsubi[`2`] << `4`) | (xsubi[`1`] >> `12`); |

40 | temp.ieee.mantissa1 = ((xsubi[`1`] & `0xfff`) << `20`) | (xsubi[`0`] << `4`); |

41 | |

42 | */* Please note the lower 4 bits of mantissa1 are always 0. */* |

43 | *result = temp.d - `1.0`; |

44 | |

45 | **return** `0`; |

46 | } |

47 | weak_alias (__erand48_r, erand48_r) |

48 | |