mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-02 13:00:26 +02:00
scm_random fix for 64-bit inums
* libguile/random.c (scm_random): Fix for 64-bit inums.
This commit is contained in:
parent
3bac8ddf92
commit
cfbccaf49c
1 changed files with 21 additions and 4 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1999,2000,2001, 2003, 2005, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1999,2000,2001, 2003, 2005, 2006, 2010 Free Software Foundation, Inc.
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License as published by the Free Software Foundation; either
|
* License as published by the Free Software Foundation; either
|
||||||
|
@ -315,9 +315,26 @@ SCM_DEFINE (scm_random, "random", 1, 1, 0,
|
||||||
SCM_VALIDATE_RSTATE (2, state);
|
SCM_VALIDATE_RSTATE (2, state);
|
||||||
if (SCM_I_INUMP (n))
|
if (SCM_I_INUMP (n))
|
||||||
{
|
{
|
||||||
unsigned long m = SCM_I_INUM (n);
|
unsigned long m = (unsigned long) SCM_I_INUM (n);
|
||||||
SCM_ASSERT_RANGE (1, n, m > 0);
|
SCM_ASSERT_RANGE (1, n, SCM_I_INUM (n) > 0);
|
||||||
return scm_from_ulong (scm_c_random (SCM_RSTATE (state), m));
|
#if SCM_SIZEOF_UNSIGNED_LONG <= 4
|
||||||
|
return scm_from_uint32 (scm_c_random (SCM_RSTATE (state),
|
||||||
|
(scm_t_uint32) m));
|
||||||
|
#elif SCM_SIZEOF_UNSIGNED_LONG <= 8
|
||||||
|
if (m <= SCM_T_UINT32_MAX)
|
||||||
|
return scm_from_uint32 (scm_c_random (SCM_RSTATE (state),
|
||||||
|
(scm_t_uint32) m));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scm_t_uint64 upper, lower;
|
||||||
|
|
||||||
|
upper = scm_c_random (SCM_RSTATE (state), (scm_t_uint32) (m >> 32));
|
||||||
|
lower = scm_c_random (SCM_RSTATE (state), SCM_T_UINT32_MAX);
|
||||||
|
return scm_from_uint64 ((upper << 32) | lower);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#error "Cannot deal with this platform's unsigned long size"
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
SCM_VALIDATE_NIM (1, n);
|
SCM_VALIDATE_NIM (1, n);
|
||||||
if (SCM_REALP (n))
|
if (SCM_REALP (n))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue