[comp.sys.sun] SunOS 4.0 drand48

magi%uwocsd.uwo.ca@cornellc.cit.cornell.edu (David Wiseman) (02/03/89)

Machine Type:   All machines, SunOS 4.0
Organization:   The University of Western Ontario
                Department of Computer Science
                London Ontario Canada N6A 5B7

Description:
        The drand48(3) man page is badly confused. As witness: read the
        following paragraph extracted from the man page.

             Functions drand48, seed48, and lcong48() are  initialization
             entry  points,  one of which should be invoked before either
             drand48, drand48, or drand48() is called.  (Although  it  is
             not   recommended  practice,  constant  default  initializer
             values will be supplied automatically if  drand48,  drand48,
             or  drand48() is called without a prior call to an initiali-
             zation  entry  point.)  Functions  drand48,   drand48,   and
             drand48() do not require an initialization entry point to be
             called first.

        You will note that drand48 appears rather often. In the DESCRIPTION
        section of this man page, each reference to one of [delnmjs]rand48()
        has been rendered drand48. Since the routines are NOT identical, this
        can make it difficult for users to decide what is true about the
        routines.

        It should also be noted that this bug appears in both the online
        documentation and in the hardcopy manuals.

Repeat-By:
        man 3 drand48

Fix:
        Merge it with the 3.5 man page. A quick scan of the 3.5 man page
        doesn't show any glaring changes. The 4.0 man page appears to have been
        "fixed" up so that it is more easily read. Unfortunately, they managed
        to "fix" it too well.

--
        David Wiseman, Network Manager                  magi@uwocsd.uwo.ca
        Department of Computer Science                  magi@uwovax.BITNET
        The University of Western Ontario       watmath!julian!uwocsd!magi
        London Ontario Canada N6A 5B7

guy@uunet.uu.net (Guy Harris) (02/10/89)

> The 4.0 man page appears to have been "fixed" up so that it is more
> easily read. Unfortunately, they managed to "fix" it too well.

Change "they" to "it", and the problem is explained; the "()" was added to
function references in the man page by a mondo shell/"sed" script.
Unfortunately, computers are really rather stupid; hand them a script and
they do what they're told to do, not what you wanted them to do.

Here's a "diff -c" script that fixes the problem (and also adds some "()"s
that the script in question missed).  If you have "patch", just use it to
apply this script to to "drand48.3"; if you don't have "patch", find
somebody who does (it's in the "comp.sources.unix" archive, and probably
in other places on "uunet"/"uu.uu.net") and grab it, because it's an
*extremely* useful program.

[[ Patch is also available in the Rice archives under "public" in four
files:  "patch.kit1" through "patch.kit4".  They can be retrieved via
anonymous FTP from the host "titan.rice.edu" or via the archive server.
For more information about the archive server, send a mail message
containing the word "help" to the address "archive-server@rice.edu".
--wnl ]]
__________

*** /usr/man/man3/drand48.3	Fri Apr  8 22:21:54 1988
--- ./drand48.3	Fri Feb  3 16:31:31 1989
***************
*** 66,79 ****
  Functions
  .B drand48(\|)
  and
! .B drand48(\|)
  return non-negative double-precision floating-point values
  uniformly distributed over the interval $[0.0,~1.0).$
  .LP
  Functions
! .B drand48(\|)
  and
! .B drand48(\|)
  return non-negative long integers uniformly distributed over the
  interval
  .if n .ig
--- 66,79 ----
  Functions
  .B drand48(\|)
  and
! .B erand48(\|)
  return non-negative double-precision floating-point values
  uniformly distributed over the interval $[0.0,~1.0).$
  .LP
  Functions
! .B lrand48(\|)
  and
! .B nrand48(\|)
  return non-negative long integers uniformly distributed over the
  interval
  .if n .ig
***************
*** 84,92 ****
  ..
  .LP
  Functions
! .B drand48(\|)
  and
! .B drand48(\|)
  return signed long integers uniformly distributed over the interval
  .if n .ig
  $[-2 sup 31 ,~2 sup 31 ).$
--- 84,92 ----
  ..
  .LP
  Functions
! .B mrand48(\|)
  and
! .B jrand48(\|)
  return signed long integers uniformly distributed over the interval
  .if n .ig
  $[-2 sup 31 ,~2 sup 31 ).$
***************
*** 96,124 ****
  ..
  .LP
  Functions
! .BR drand48 ,
! .BR seed48 ,
  and
  .B lcong48(\|)
  are initialization entry points, one of which should be invoked before
  either
! .BR drand48 ,
! .BR drand48 ,
  or
! .B drand48(\|)
  is called.
  (Although it is not recommended practice,
  constant default initializer values will be supplied automatically if
! .BR drand48 ,
! .BR drand48 ,
  or
! .B drand48(\|)
  is called without a prior call to an initialization entry point.)
  Functions
! .BR drand48 ,
! .BR drand48 ,
  and
! .B drand48(\|)
  do not require an initialization entry point to be called first.
  .LP
  All the routines work by generating a sequence of 48-bit integer values,
--- 96,124 ----
  ..
  .LP
  Functions
! .BR srand48(\|) ,
! .BR seed48(\|) ,
  and
  .B lcong48(\|)
  are initialization entry points, one of which should be invoked before
  either
! .BR drand48(\|) ,
! .BR lrand48(\|) ,
  or
! .B mrand48(\|)
  is called.
  (Although it is not recommended practice,
  constant default initializer values will be supplied automatically if
! .BR drand48(\|) ,
! .BR lrand48(\|) ,
  or
! .B mrand48(\|)
  is called without a prior call to an initialization entry point.)
  Functions
! .BR erand48(\|) ,
! .BR nrand48(\|) ,
  and
! .B jrand48(\|)
  do not require an initialization entry point to be called first.
  .LP
  All the routines work by generating a sequence of 48-bit integer values,
***************
*** 152,164 ****
  .RE
  .LP
  The value returned by any of the functions
! .BR drand48 ,
! .BR drand48 ,
! .BR drand48 ,
! .BR drand48 ,
! .BR drand48 ,
  or
! .B drand48(\|)
  is computed by first generating the next 48-bit $X sub i$ in the sequence.
  Then the appropriate number of bits, according to the type of data item
  to be returned, are copied from the high-order (leftmost) bits of $X sub i$
--- 152,164 ----
  .RE
  .LP
  The value returned by any of the functions
! .BR drand48(\|) ,
! .BR erand48(\|) ,
! .BR lrand48(\|) ,
! .BR nrand48(\|) ,
! .BR mrand48(\|) ,
  or
! .B jrand48(\|)
  is computed by first generating the next 48-bit $X sub i$ in the sequence.
  Then the appropriate number of bits, according to the type of data item
  to be returned, are copied from the high-order (leftmost) bits of $X sub i$
***************
*** 165,181 ****
  and transformed into the returned value.
  .LP
  The functions
! .BR drand48 ,
! .BR drand48 ,
  and
! .B drand48(\|)
  store the last 48-bit $X sub i$ generated in an internal buffer;
  that is why they must be initialized prior to being invoked.
  The functions
! .BR drand48 ,
! .BR drand48 ,
  and
! .B drand48(\|)
  require the calling program to provide storage for the
  successive $X sub i$ values in the array
  specified as an argument when the functions are invoked.
--- 165,181 ----
  and transformed into the returned value.
  .LP
  The functions
! .BR drand48(\|) ,
! .BR lrand48(\|) ,
  and
! .B mrand48(\|)
  store the last 48-bit $X sub i$ generated in an internal buffer;
  that is why they must be initialized prior to being invoked.
  The functions
! .BR erand48(\|) ,
! .BR nrand48(\|) ,
  and
! .B jrand48(\|)
  require the calling program to provide storage for the
  successive $X sub i$ values in the array
  specified as an argument when the functions are invoked.
***************
*** 184,193 ****
  array and pass it as an argument.
  By using different
  arguments, functions
! .BR drand48 ,
! .BR drand48 ,
  and
! .B drand48(\|)
  allow separate modules of a large program to generate several
  .I independent
  streams of pseudo-random numbers, that is,
--- 184,193 ----
  array and pass it as an argument.
  By using different
  arguments, functions
! .BR erand48(\|) ,
! .BR nrand48(\|) ,
  and
! .B jrand48(\|)
  allow separate modules of a large program to generate several
  .I independent
  streams of pseudo-random numbers, that is,
***************
*** 197,203 ****
  numbers for the other streams.
  .LP
  The initializer function
! .B drand48(\|)
  sets the high-order 32 bits of $X sub i$ to the 32 bits contained in
  its argument.
  The low-order 16 bits of $X sub i$ are set to the arbitrary value
--- 197,203 ----
  numbers for the other streams.
  .LP
  The initializer function
! .B srand48(\|)
  sets the high-order 32 bits of $X sub i$ to the 32 bits contained in
  its argument.
  The low-order 16 bits of $X sub i$ are set to the arbitrary value
***************
*** 209,217 ****
  argument array.
  In addition, the previous value of $X sub i$ is copied into a 48-bit
  internal buffer, used only by
! .BR seed48 ,
  and a pointer to this buffer is the value returned by
! .BR seed48 .
  This returned pointer, which can just be ignored if not needed, is useful
  if a program is to be restarted from a given point at some future time
  \(em use the pointer to get at and store the last $X sub i$ value, and
--- 209,217 ----
  argument array.
  In addition, the previous value of $X sub i$ is copied into a 48-bit
  internal buffer, used only by
! .BR seed48(\|) ,
  and a pointer to this buffer is the value returned by
! .BR seed48(\|) .
  This returned pointer, which can just be ignored if not needed, is useful
  if a program is to be restarted from a given point at some future time
  \(em use the pointer to get at and store the last $X sub i$ value, and
***************
*** 232,238 ****
  specifies the 16-bit addend $c.$ After
  .B lcong48(\|)
  has been called, a subsequent call to either
! .B drand48(\|)
  or
  .B seed48(\|)
  will restore the \(lqstandard\(rq multiplier and addend values, $a$ and $c,$
--- 232,238 ----
  specifies the 16-bit addend $c.$ After
  .B lcong48(\|)
  has been called, a subsequent call to either
! .B srand48(\|)
  or
  .B seed48(\|)
  will restore the \(lqstandard\(rq multiplier and addend values, $a$ and $c,$