annotate man/lispref/numbers.texi @ 4407:4ee73bbe4f8e

Always use boyer_moore in ASCII or Latin-1 buffers with ASCII search strings. 2007-12-26 Aidan Kehoe <kehoea@parhasard.net> * casetab.c: Extend and correct some case table documentation. * search.c (search_buffer): Correct a bug where only the first entry for a character in the case equivalence table was examined in determining if the Boyer-Moore search algorithm is appropriate. If there are case mappings outside of the charset and row of the characters specified in the search string, those case mappings can be safely ignored (and Boyer-Moore search can be used) if we know from the buffer statistics that the corresponding characters cannot occur. * search.c (boyer_moore): Assert that we haven't been passed a string with varying characters sets or rows within character sets. That's what simple_search is for. In the very rare event that a character in the search string has a canonical case mapping that is not in the same character set and row, don't try to search for the canonical character, search for some other character that is in the the desired character set and row. Assert that the case table isn't corrupt. Do not search for any character case mappings that cannot possibly occur in the buffer, given the buffer metadata about its contents.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 26 Dec 2007 17:30:16 +0100
parents c91543697b09
children b5e1d4f6b66f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 @c -*-texinfo-*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 @c This is part of the XEmacs Lisp Reference Manual.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 @c See the file lispref.texi for copying conditions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 @setfilename ../../info/numbers.info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 @node Numbers, Strings and Characters, Lisp Data Types, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 @chapter Numbers
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
8 @c #### Improve the indexing in this file!!!!
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 @cindex integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 @cindex numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
12 XEmacs supports two to five numeric data types. @dfn{Integers} and
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
13 @dfn{floating point numbers} are always supported. As a build-time
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
14 option, @dfn{bignums}, @dfn{ratios}, and @dfn{bigfloats} may be
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
15 enabled on some platforms.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
16
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
17 Integers, which are what Common Lisp calls
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
18 @dfn{fixnums}, are whole numbers such as @minus{}3, 0, #b0111, #xFEED,
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
19 #o744. Their values are exact, and their range is limited. The
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 number prefixes `#b', `#o', and `#x' are supported to represent numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 in binary, octal, and hexadecimal notation (or radix). Floating point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 numbers are numbers with fractional parts, such as @minus{}4.5, 0.0, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 2.71828. They can also be expressed in exponential notation: 1.5e2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 equals 150; in this example, @samp{e2} stands for ten to the second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 power, and is multiplied by 1.5. Floating point values are not exact;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 they have a fixed, limited amount of precision.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
28 Bignums are arbitrary precision integers. When supported, XEmacs can
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
29 handle any integral calculations you have enough virtual memory to
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
30 store. (More precisely, on current architectures the representation
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
31 allows integers whose storage would exhaust the address space.) They
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
32 are notated in the same way as other integers (fixnums). XEmacs
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
33 automatically converts results of computations from fixnum to bignum,
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
34 and back, depending on the storage required to represent the number.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
35 Thus use of bignums are entirely transparent to the user, except for a
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
36 few special applications that expect overflows. Ratios are rational
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
37 numbers with arbitrary precision. They are notated in the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
38 usual way with the solidus, for example 5/3 or @minus{}22/7.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
39
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
40 Bigfloats are floating point numbers with arbitrary precision, which
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
41 may be specified by the user (and may be different for different
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
42 bigfloats at the same time). Unlike integers, which are always
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
43 infinitely precise if they can be represented, floating point numbers
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
44 are inherently imprecise. This means that choice of precision can be a
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
45 very delicate issue. XEmacs automatically converts @emph{from float to
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
46 bigfloat} when floats and bigfloats are mixed in an expression, but a
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
47 bigfloat will never be converted to a float unless the user explicitly
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
48 coerces the value. Nor will the result of a float operation be
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
49 converted to bigfloat, except for ``contagion'' from another operand
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
50 that is already a bigfloat. However, when bigfloats of differing
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
51 precision are mixed, the result will always have the larger precision.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
52 The exact rules are more carefully explained elsewhere
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
53 (@pxref{Canonicalization and Contagion}).
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
54
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
55 Note that the term ``integer'' is used throughout the XEmacs
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
56 documentation and code to mean ``fixnum''. This is inconsistent with
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
57 Common Lisp, and likely to cause confusion. Similarly, ``float'' is
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
58 used to mean ``fixed precision floating point number'', and the Common
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
59 Lisp distinctions among @dfn{short-floats}, @dfn{long-floats},
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
60 @emph{etc.}, and bigfloats (which are not standardized in Common Lisp)
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
61 are not reflected in XEmacs terminology. (Volunteers to fix this in the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
62 XEmacs manuals would be heartily welcomed.)
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
63
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 * Integer Basics:: Representation and range of integers.
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
66 * Rational Basics:: Representation and range of rational numbers.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
67 * Float Basics:: Representation and range of floating point.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
68 * The Bignum Extension:: Arbitrary precision integers, ratios, and floats.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 * Predicates on Numbers:: Testing for numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 * Comparison of Numbers:: Equality and inequality predicates.
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
71 * Numeric Conversions:: Converting float to integer and vice versa.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 * Arithmetic Operations:: How to add, subtract, multiply and divide.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 * Rounding Operations:: Explicitly rounding floating point numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 * Bitwise Operations:: Logical and, or, not, shifting.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 * Math Functions:: Trig, exponential and logarithmic functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 * Random Numbers:: Obtaining random integers, predictable or not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 @node Integer Basics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 @section Integer Basics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
82 The range of values for an integer depends on the machine. If a
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
83 multiple-precision arithmetic library is available on your platform,
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
84 support for bignums, that is, integers with arbitrary precision, may be
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
85 compiled in to your XEmacs. The rest of this section assumes that the
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
86 bignum extension is @emph{not} available. The bignum extension and the
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
87 user-visible differences in normal integer arithmetic are discussed in a
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
88 separate section @ref{The Bignum Extension}.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
89
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
90 The minimum range is @minus{}1073741824 to 1073741823 (31 bits; i.e.,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
91 @ifinfo
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
92 -2**30
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 @end ifinfo
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
94 @tex
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
95 $-2^{30}$
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 @end tex
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
97 to
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
98 @ifinfo
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
99 2**30 - 1),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 @end ifinfo
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
101 @tex
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
102 $2^{30}-1$),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 @end tex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 but some machines may provide a wider range. Many examples in this
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
105 chapter assume an integer has 31 bits.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 @cindex overflow
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
108 The range of fixnums is available to Lisp programs:
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
109
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
110 @defvar most-positive-fixnum
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
111 The fixed-precision integer closest in value to positive infinity.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
112 @end defvar
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
113
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
114 @defvar most-negative-fixnum
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
115 The fixed-precision integer closest in value to negative infinity.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
116 @end defvar
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
117
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
118 Here is a common idiom to temporarily suppress garbage collection:
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
119 @example
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
120 (garbage-collect)
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
121 (let ((gc-cons-threshold most-positive-fixnum))
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
122 ;; allocation-intensive computation
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
123 )
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
124 (garbage-collect)
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
125 @end example
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
126
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 The Lisp reader reads an integer as a sequence of digits with optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 initial sign and optional final period.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 1 ; @r{The integer 1.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 1. ; @r{The integer 1.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 +1 ; @r{Also the integer 1.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 -1 ; @r{The integer @minus{}1.}
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
135 2147483648 ; @r{Read error, due to overflow.}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 0 ; @r{The integer 0.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 -0 ; @r{The integer 0.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 To understand how various functions work on integers, especially the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 bitwise operators (@pxref{Bitwise Operations}), it is often helpful to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 view the numbers in their binary form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
144 In 31-bit binary, the decimal integer 5 looks like this:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 @example
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
147 000 0000 0000 0000 0000 0000 0000 0101
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 (We have inserted spaces between groups of 4 bits, and two spaces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 between groups of 8 bits, to make the binary integer easier to read.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 The integer @minus{}1 looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 @example
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
157 111 1111 1111 1111 1111 1111 1111 1111
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 @cindex two's complement
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
162 @minus{}1 is represented as 31 ones. (This is called @dfn{two's
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 complement} notation.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 The negative integer, @minus{}5, is creating by subtracting 4 from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 @minus{}1. In binary, the decimal integer 4 is 100. Consequently,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 @minus{}5 looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 @example
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
170 111 1111 1111 1111 1111 1111 1111 1011
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
173 In this implementation, the largest 31-bit binary integer is the
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
174 decimal integer 1,073,741,823. In binary, it looks like this:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 @example
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
177 011 1111 1111 1111 1111 1111 1111 1111
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 Since the arithmetic functions do not check whether integers go
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
181 outside their range, when you add 1 to 1,073,741,823, the value is the
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
182 negative integer @minus{}1,073,741,824:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 @example
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
185 (+ 1 1073741823)
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
186 @result{} -1073741824
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
187 @result{} 100 0000 0000 0000 0000 0000 0000 0000
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
190 Many of the arithmetic functions accept markers for arguments as well
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 as integers. (@xref{Markers}.) More precisely, the actual arguments to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 such functions may be either integers or markers, which is why we often
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 give these arguments the name @var{int-or-marker}. When the argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 value is a marker, its position value is used and its buffer is ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 In version 19, except where @emph{integer} is specified as an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 argument, all of the functions for markers and integers also work for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 floating point numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
202
2032
cc89c76c4b17 [xemacs-hg @ 2004-04-19 11:11:59 by stephent]
stephent
parents: 2028
diff changeset
203 @node Rational Basics
cc89c76c4b17 [xemacs-hg @ 2004-04-19 11:11:59 by stephent]
stephent
parents: 2028
diff changeset
204 @section Rational Basics
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
205
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
206 Ratios (built-in rational numbers) are available only when the bignum
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
207 extension is built into your XEmacs. This facility is new and
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
208 experimental. It is discussed in a separate section for convenience of
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
209 updating the documentation @ref{The Bignum Extension}. The following
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
210 functions are defined regardless of the presence of the extension, but
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
211 have trivial results for integers.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
212
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
213 @defun numerator rational
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
214 @cindex numbers
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
215 Return the numerator of the canonical form of @var{rational}.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
216 If @var{rational} is an integer, @var{rational} is returned.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
217 @var{rational} must be an integer or a ratio.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
218 @end defun
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
219
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
220 @defun denominator rational
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
221 Return the denominator of the canonical form of @var{rational}.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
222 If @var{rational} is an integer, 1 is returned. @var{rational} must be
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
223 an integer or a ratio.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
224 @end defun
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
225
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
226
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 @node Float Basics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 @section Floating Point Basics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 XEmacs supports floating point numbers. The precise range of floating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 point numbers is machine-specific; it is the same as the range of the C
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
232 data type @code{double} on the machine in question. If a
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
233 multiple-precision arithmetic library is available on your platform,
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
234 support for bigfloats, that is, floating point numbers with arbitrary
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
235 precision, may be compiled in to your XEmacs. The rest of this section
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
236 assumes that the bignum extension is @emph{not} available. The bigfloat
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
237 extension and the user-visible differences in normal float arithmetic
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
238 are discussed in a separate section @ref{The Bignum Extension}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 The printed representation for floating point numbers requires either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 a decimal point (with at least one digit following), an exponent, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 both. For example, @samp{1500.0}, @samp{15e2}, @samp{15.0e2},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 @samp{1.5e3}, and @samp{.15e4} are five ways of writing a floating point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 number whose value is 1500. They are all equivalent. You can also use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 a minus sign to write negative floating point numbers, as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 @samp{-1.0}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 @cindex IEEE floating point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 @cindex positive infinity
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 @cindex negative infinity
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 @cindex infinity
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 @cindex NaN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 Most modern computers support the IEEE floating point standard, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 provides for positive infinity and negative infinity as floating point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 values. It also provides for a class of values called NaN or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 ``not-a-number''; numerical functions return such values in cases where
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 there is no correct answer. For example, @code{(sqrt -1.0)} returns a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 NaN. For practical purposes, there's no significant difference between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 different NaN values in XEmacs Lisp, and there's no rule for precisely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 which NaN value should be used in a particular case, so this manual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 doesn't try to distinguish them. XEmacs Lisp has no read syntax for NaNs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 or infinities; perhaps we should create a syntax in the future.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 You can use @code{logb} to extract the binary exponent of a floating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 point number (or estimate the logarithm of an integer):
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 @defun logb number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 This function returns the binary exponent of @var{number}. More
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 precisely, the value is the logarithm of @var{number} base 2, rounded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 down to an integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
273 The range of floats is available to Lisp programs:
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
274
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
275 @defvar most-positive-float
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
276 The fixed-precision floating-point-number closest in value to positive
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
277 infinity.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
278 @end defvar
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
279
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
280 @defvar most-negative-float
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
281 The fixed-precision floating point number closest in value to negative
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
282 infinity.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
283 @end defvar
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
284
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
285 @defvar least-positive-float
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
286 The positive float closest in value to 0. May not be normalized.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
287 @end defvar
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
288
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
289 @defvar least-negative-float
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
290 The positive float closest in value to 0. Must be normalized.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
291 @end defvar
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
292
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
293 @defvar least-positive-normalized-float
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
294 The negative float closest in value to 0. May not be normalized.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
295 @end defvar
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
296
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
297 @defvar least-negative-normalized-float
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
298 The negative float closest in value to 0. Must be normalized.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
299 @end defvar
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
300
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
301 Note that for floating point numbers there is an interesting limit on
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
302 how small they can get, as well as a limit on how big they can get. In
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
303 some representations, a floating point number is @dfn{normalized} if the
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
304 leading digit is non-zero. This allows representing numbers smaller
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
305 than the most-negative exponent can express, by having fractional
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
306 mantissas. This means that the number is less precise than a normalized
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
307 floating point number, so Lisp programs can detect loss of precision due
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
308 to unnormalized floats by checking whether the number is between
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
309 @code{least-positive-float} and @code{least-positive-normalized-float}.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
310
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
311
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
312 @node The Bignum Extension
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
313 @section The Bignum Extension
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
314
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
315 In XEmacs 21.5.18, an extension was added by @email{james@@xemacs.org,
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
316 Jerry James} to allow linking with arbitrary-precision arithmetic
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
317 libraries if they are available on your platform. ``Arbitrary''
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
318 precision means precisely what it says. Your ability to work with large
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
319 numbers is limited only by the amount of virtual memory (and time) you
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
320 can throw at them.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
321
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
322 As of 09 April 2004, support for the GNU Multiple Precision
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
323 arithmetic library (GMP) is nearly complete, and support for the BSD
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
324 Multiple Precision arithmetic library (MP) is being debugged. To enable
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
325 bignum support using GMP (respectively MP), invoke configure with your
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
326 usual options, and add @samp{--use-number-lib=gmp} (respectively
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
327 @samp{--use-number-lib=mp}). The default is to disable bignum support,
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
328 but if you are using a script to automate the build process, it may be
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
329 convenient to explicitly disable support by @emph{appending}
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
330 @samp{--use-number-lib=no} to your invocation of configure. GMP has an
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
331 MP compatibility mode, but it is not recommended, as there remain poorly
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
332 understood bugs (even more so than for other vendors' versions of MP).
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
333
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
334 With GMP, exact arithmetic with integers and ratios of arbitrary
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
335 precision and approximate (``floating point'') arithmetic of arbitrary
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
336 precision are implemented efficiently in the library. (Note that
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
337 numerical implementations are quite delicate and sensitive to
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
338 optimization. If the library was poorly optimized for your hardware, as
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
339 is often the case with Linux distributions for 80x86, you may achieve
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
340 gains of @emph{several orders of magnitude} by rebuilding the MP
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
341 library. See @uref{http://www.swox.com/gmp/gmp-speed.html}.) The MP
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
342 implementation provides arbitrary precision integers. Ratios and arbitrary
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
343 precision floats are not available with MP.
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
344
2033
a7b2d995287f [xemacs-hg @ 2004-04-19 11:25:58 by stephent]
stephent
parents: 2032
diff changeset
345 If your code needs to run correctly whether or not the feature is
a7b2d995287f [xemacs-hg @ 2004-04-19 11:25:58 by stephent]
stephent
parents: 2032
diff changeset
346 provided, you may test for the features @code{bignum}, @code{ratio}, and
a7b2d995287f [xemacs-hg @ 2004-04-19 11:25:58 by stephent]
stephent
parents: 2032
diff changeset
347 @code{bigfloat}.
a7b2d995287f [xemacs-hg @ 2004-04-19 11:25:58 by stephent]
stephent
parents: 2032
diff changeset
348
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
349 The XEmacs bignum facility implements the Common Lisp notions of
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
350 @dfn{canonicalization} and @dfn{contagion}. Canonicalization means that
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
351 in exact (integer and ratio) arithmetic, a result of an operation is
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
352 always converted to the ``smallest'' type that can represent it
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
353 exactly. For exact numbers, the user only cares if efficiency is
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
354 extremely important; Lisp does not try to determine an order of
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
355 computation that avoids conversion to bignum (or ratio) even if one is
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
356 available. (Note that integers are never silently converted to
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
357 ratios: the result of @code{(/ 1 2)} is the integer @code{0}. You can
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
358 @emph{request} that a ratio be used if needed with @code{(div 1 2)}.)
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
359
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
360 Since floating point arithmetic is inherently imprecise, numbers are
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
361 implicitly coerced to bigfloats only if other operands in the expression
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
362 are bigfloat, and bigfloats are only coerced to other numerical types by
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
363 explicit calls to the function @code{coerce}.
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
364
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
365 Bignum support is incomplete. If you would like to help with bignum
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
366 support, especially on BSD MP, please subscribe to the
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
367 @uref{http://www.xemacs.org/Lists/#xemacs-beta, XEmacs Beta mailing
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
368 list}, and book up on @file{number-gmp.h} and @file{number-mp.h}. Jerry
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
369 has promised to write internals documentation eventually, but if your
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
370 skills run more to analysis and documentation than to writing new code,
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
371 feel free to fill in the gap!
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
372
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
373 @menu
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
374 * Bignum Basics:: Representation and range of integers.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
375 * Ratio Basics:: Representation and range of rational numbers.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
376 * Bigfloat Basics:: Representation and range of floating point.
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
377 * Canonicalization and Contagion:: Automatic coercion to other types.
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
378 * Compatibility Issues:: Changes in fixed-precision arithmetic.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
379 @end menu
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
380
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
381
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
382 @node Bignum Basics
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
383 @subsection Bignum Basics
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
384
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
385 In most cases, bignum support should be transparent to users and Lisp
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
386 programmers. A bignum-enabled XEmacs will automatically convert from
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
387 fixnums to bignums and back in pure integer arithmetic, and for GNU MP,
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
388 from floats to bigfloats. (Bigfloats must be explicitly coerced to
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
389 other types, even if they are exactly representable by less precise
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
390 types.) The Lisp reader and printer have been enhanced to handle
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
391 bignums, as have the mathematical functions. Rationals (fixnums,
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
392 bignums, and ratios) are printed using the @samp{%d}, @samp{%o},
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
393 @samp{%x}, and @samp{%u} format conversions.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
394
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
395
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
396 @node Ratio Basics
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
397 @subsection Ratio Basics
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
398
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
399 Ratios, when available have the read syntax and print representation
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
400 @samp{3/5}. Like other rationals (fixnums and bignums), they are
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
401 printed using the @samp{%d}, @samp{%o}, @samp{%x}, and @samp{%u} format
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
402 conversions.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
403
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
404
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
405 @node Bigfloat Basics
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
406 @subsection Bigfloat Basics
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
407
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
408 Bigfloats, when available, have the same read syntax and print
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
409 representations as fixed-precision floats.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
410
2182
c91543697b09 [xemacs-hg @ 2004-07-19 08:24:24 by stephent]
stephent
parents: 2091
diff changeset
411 It is possible to make bigfloat the default floating point format by
c91543697b09 [xemacs-hg @ 2004-07-19 08:24:24 by stephent]
stephent
parents: 2091
diff changeset
412 setting @code{default-float-precision} to a non-zero value. Precision
c91543697b09 [xemacs-hg @ 2004-07-19 08:24:24 by stephent]
stephent
parents: 2091
diff changeset
413 is given in bits, with a maximum precision of @code{bigfloat-max-prec}.
c91543697b09 [xemacs-hg @ 2004-07-19 08:24:24 by stephent]
stephent
parents: 2091
diff changeset
414 @c #### is this true?
c91543697b09 [xemacs-hg @ 2004-07-19 08:24:24 by stephent]
stephent
parents: 2091
diff changeset
415 Bigfloats are created automatically when a number with yes
c91543697b09 [xemacs-hg @ 2004-07-19 08:24:24 by stephent]
stephent
parents: 2091
diff changeset
416
c91543697b09 [xemacs-hg @ 2004-07-19 08:24:24 by stephent]
stephent
parents: 2091
diff changeset
417
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
418
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
419 @node Canonicalization and Contagion
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
420 @subsection Canonicalization and Contagion
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
421
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
422 @dfn{Canonicalization} is a rule intended to enhance the time and space
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
423 efficiency of exact arithmetic. Because bignums and ratios are
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
424 implemented as record objects, they take up much more space than
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
425 fixnums, which are implemented as an immediate object. Conversions and
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
426 calls to the MP library also take time. So the implementation always
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
427 converts the result of exact arithmetic to the smallest representation
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
428 that can exactly represent the quantity.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
429
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
430 @example
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
431 (+ 3/4 5)
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
432 @result{} 23/4
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
433
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
434 (+ 3/4 1/4 2)
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
435 @result{} 3
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
436 @end example
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
437
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
438 Conversely, if an integer (read or computed) cannot be represented as a
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
439 fixnum, a bignum will be used. Integer division is a somewhat
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
440 exceptional case. Because it is useful and is the historical meaning of
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
441 the function @code{/}, a separate function @code{div} is provided.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
442 @code{div} is identical to @code{/} except that when the rational result
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
443 is not an integer, it is represented exactly as a ratio. In both cases
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
444 if a rational result is an integer, it is automatically converted to the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
445 appropriate integral representation.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
446
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
447 Note that the efficiency gain from canonicalization is likely to be
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
448 less than you might think. Experience with numerical analysis shows that
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
449 in very precise calculations, the required precision tends to increase.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
450 Thus it is typically wasted effort to attempt to convert to smaller
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
451 representations, as the number is often reused and requires a larger
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
452 representation. However, XEmacs Lisp presumes that calculations using
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
453 bignums are the exception, so it applies canonicalization.
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
454
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
455 @dfn{Contagion} is one way to address the requirement that an arithmetic
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
456 operation should not fail because of differing types of the operands.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
457 Contagion is the idea that less precise operands are converted to the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
458 more precise type, and then the operation is performed. While changing
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
459 precision is a delicate issue, contagion is so useful that XEmacs
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
460 performs it automatically.
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
461
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
462 In XEmacs, the following rules of contagion are used:
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
463
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
464 @c #### this probably wants names for each rule
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
465 @enumerate
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
466 @item
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
467 If an expression mixes an integral type with a ratio, then the usual
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
468 rules of rational arithmetic apply. (If the result of the expression
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
469 happens to be an integer, it will be canonicalized to integer.)
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
470
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
471 @item
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
472 If an expression mixes a rational type (fixnum, bignum, or ratio) with a
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
473 float, the rational operand is converted to a float and the operation
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
474 performed if the result would fit in a float, otherwise both operands
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
475 are promoted to bigfloat, and the operation performed.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
476
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
477 @item
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
478 If an expression mixes any other type with a bigfloat, the other operand
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
479 is converted to bigfloat and the operation performed.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
480
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
481 @item
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
482 If bigfloats of different precision are mixed, all are converted to the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
483 @emph{highest} precision, and the operation performed.
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
484 @end enumerate
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
485
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
486 Note that there are no rules to canonicalize floats or bigfloats. This
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
487 might seem surprising, but in both cases information will be lost. Any
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
488 floating point representation is implicitly approximate. A conversion
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
489 to a rational type, even if it seems exact, loses this information.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
490 More subtly, demoting a bigfloat to a smaller bigfloat or to a float
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
491 would lose information about the precision of the result, and thus some
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
492 information about the accuracy. Thus floating point numbers are always
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
493 already in canonical form.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
494
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
495 Of course the programmer can explicitly request canonicalization, or
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
496 more coercion to another type. Coercion uses the Common Lisp
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
497 compatibility function @code{coerce} from the @file{cl-extra.el}
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
498 library. A number can be explicitly converted to canonical form
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
499 according to the above rules using
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
500
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
501 @defun canonicalize-number number
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
502 Return the canonical form of @var{number}.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
503 @end defun
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
504
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
505 However, if we've done our job properly, this is always a no-op. That
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
506 is, if you find a number in un-canonicalized form, please report it as a
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
507 bug.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
508
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
509
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
510 @node Compatibility Issues
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
511 @subsection Compatibility Issues
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
512
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
513 @emph{Surgeon General's Warning}: The automatic conversions cannot be
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
514 disabled at runtime. Old functions will not produce ratios unless there
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
515 is a ratio operand, so there should be few surprises with type
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
516 conflicts (the contagion rules are quite natural for Lisp programmers
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
517 used to the behavior of integers and floats in pre-21.5.18 XEmacsen),
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
518 but they can't be ruled out. Also, if you work with extremely large
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
519 numbers, your machine may arbitrarily decide to hand you an unpleasant
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
520 surprise rather than a bignum.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
521
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
522 User-visible changes in behavior include (in probable order of annoyance)
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
523
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
524 @itemize
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
525 @item
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
526 Arithmetic can cause a segfault, depending on your MP library.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
527
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
528 GMP by default allocates temporaries on the stack. If you run out of
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
529 stack space, you're dead; there is no way that we know of to reliably
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
530 detect this condition, because @samp{alloca} is typically implemented to
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
531 be @emph{fast} rather than robust. If you just need a little more
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
532 oomph, use a bigger stack (@emph{e.g.}, the @file{ulimit -s} command in
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
533 bash(1)). If you want robustness at the cost of speed, configure GMP
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
534 with @samp{--disable-alloca} and rebuild the GMP library.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
535
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
536 We do not know whether BSD MP uses @samp{alloca} or not. Please send
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
537 any information you have as a bug report (@kbd{M-x report-xemacs-bug
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
538 @key{RET}}), which will give us platform information. (We do know that
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
539 BSD MP implementations vary across vendors, but how much, we do not know
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
540 yet.)
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
541
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
542 @item
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
543 Terminology is not Common-Lisp-conforming. For example, ``integer'' for
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
544 Emacs Lisp means what Common Lisp calls ``fixnum''. This issue is being
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
545 investigated, but the use of ``integer'' for fixnum is pervasive and may
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
546 cause backward-compatibility and GNU-Emacs-compatibility problems.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
547 There are similar issues for floating point numbers. Since Emacs Lisp
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
548 has not had a ratio type before, there should be no problems there.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
549
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
550 @item
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
551 An atom with ratio read syntax now returns a number, not a symbol.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
552
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
553 @item
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
554 Many operations that used to cause a range error now succeed, with
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
555 intermediate results and return values coerced to bignums as needed.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
556
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
557 @item
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
558 The @samp{%u} format conversion will now give an error if its argument
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
559 is negative. (Without MP, it prints a number which Lisp can't read.)
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
560 @end itemize
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
561
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
562 This is not a compatibility issue in the sense of specification, but
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
563 careless programmers who have taken advantage of the immediate
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
564 representation for numbers and written @code{(eq x y)} are in for a
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
565 surprise. This doesn't work with bignums, even if both arguments are
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
566 bignums! Arbitrary precision obviously requires consing new objects
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
567 because the objects are ``large'' and of variable size, and the
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
568 definition of @samp{eq} does not permit different objects to compare as
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
569 equal. Instead of @code{eq}, use @code{eql}, in which numbers of the
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
570 same type which have equal values compare equal, or @code{=}, which does
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
571 any necessary type coercions before comparing for equality
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
572 @ref{Comparison of Numbers}.
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
573
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
574
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 @node Predicates on Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 @section Type Predicates for Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 The functions in this section test whether the argument is a number or
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
579 whether it is a certain sort of number. The functions which test for
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
580 type can take any type of Lisp object as argument (the more general
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
581 predicates would not be of much use otherwise). However, the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
582 @code{zerop} predicate requires a number as its argument, and the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
583 @code{evenp}, and @code{oddp} predicates require integers as their
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
584 arguments. See also @code{integer-or-marker-p},
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
585 @code{integer-char-or-marker-p}, @code{number-or-marker-p} and
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
586 @code{number-char-or-marker-p}, in @ref{Predicates on Markers}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
588 @defun numberp object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
589 This predicate tests whether its argument is a number (either integer or
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
590 floating point), and returns @code{t} if so, @code{nil} otherwise.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
591 @end defun
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
593 @defun realp object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
594 @cindex numbers
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
595 The @code{realp} predicate tests to see whether @var{object} is a
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
596 rational or floating point number, and returns @code{t} if so,
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
597 @code{nil} otherwise. Currently equivalent to @code{numberp}.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
598 @end defun
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
599
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
600 @defun zerop number
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
601 This predicate tests whether its argument is zero, and returns @code{t}
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
602 if so, @code{nil} otherwise. The argument must be a number.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
603
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
604 These two forms are equivalent: @code{(zerop x)} @equiv{} @code{(= x 0)}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 @defun integerp object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 This predicate tests whether its argument is an integer, and returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 @code{t} if so, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
612 @defun oddp integer
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
613 @cindex integers
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
614 The @code{oddp} predicate tests to see whether @var{integer} is odd, and
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
615 returns @code{t} if so, @code{nil} otherwise. @var{integer} must be an
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
616 integer.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
617 @end defun
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
618
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
619 @defun evenp integer
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
620 @cindex integers
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
621 The @code{evenp} predicate tests to see whether @var{integer} is even,
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
622 and returns @code{t} if so, @code{nil} otherwise. @var{integer} must be
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
623 an integer.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 @defun natnump object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 @cindex natural numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 The @code{natnump} predicate (whose name comes from the phrase
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 ``natural-number-p'') tests to see whether its argument is a nonnegative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 integer, and returns @code{t} if so, @code{nil} otherwise. 0 is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 considered non-negative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
634 @defun fixnump object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
635 @cindex integers
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
636 The @code{} predicate tests to see whether its argument is an integer
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
637 represented as a fixnum, and returns @code{t} if so, @code{nil}
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
638 otherwise.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
639 @end defun
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
640
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
641 @defun bignump object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
642 @cindex integers
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
643 The @code{bignump} predicate tests to see whether @var{object} is an
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
644 integer represented as a bignum, and returns @code{t} if so, @code{nil}
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
645 otherwise.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
646 @end defun
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
647
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
648 @defun rationalp object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
649 @cindex numbers
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
650 The @code{rationalp} predicate tests to see whether @var{object} is a
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
651 rational number, and returns @code{t} if so, @code{nil} otherwise.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
652 @end defun
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
654 @defun ratiop object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
655 @cindex ratios
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
656 The @code{ratiop} predicate tests to see whether @var{object} is a
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
657 number represented as a ratio, and returns @code{t} if so, @code{nil}
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
658 otherwise.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
659 @end defun
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
660
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
661 @defun floatingp object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
662 @cindex floats
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
663 The @code{floatingp} predicate tests to see whether @var{object} is a
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
664 floating point number represented as a float or a bigfloat, and returns
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
665 @code{t} if so, @code{nil} otherwise.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
668 @defun floatp object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
669 @cindex floats
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
670 This predicate tests whether its argument is a floating point
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
671 number and returns @code{t} if so, @code{nil} otherwise.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
672
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
673 @code{floatp} does not exist in Emacs versions 18 and earlier. If the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
674 bignum extension is present, it returns @code{nil} for a bigfloat.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
675 @end defun
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
676
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
677 @defun bigfloatp object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
678 @cindex floats
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
679 The @code{bigfloatp} predicate tests to see whether @var{object} is an
2091
0221e454fe63 [xemacs-hg @ 2004-05-21 03:27:55 by stephent]
stephent
parents: 2090
diff changeset
680 floating point number represented as a bigfloat, and returns @code{t} if
0221e454fe63 [xemacs-hg @ 2004-05-21 03:27:55 by stephent]
stephent
parents: 2090
diff changeset
681 so, @code{nil} otherwise.
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
682 @end defun
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
683
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
684
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 @node Comparison of Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 @section Comparison of Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 @cindex number equality
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 To test numbers for numerical equality, you should normally use
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
690 @code{=}, not @code{eq}. There can be many distinct floating point,
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
691 bignum, and ratio number objects with the same numeric value. If you
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
692 use @code{eq} to compare them, then you test whether two values are the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
693 same @emph{object}. By contrast, @code{=} compares only the numeric
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
694 values of the objects.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695
2028
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
696 In versions before 21.5.18, each integer value had a unique Lisp
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
697 object in XEmacs Lisp. Therefore, @code{eq} was equivalent to @code{=}
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
698 where integers are concerned. Even with the introduction of bignums, it
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
699 is sometimes convenient to use @code{eq} for comparing an unknown value
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
700 with an integer, because @code{eq} does not report an error if the
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
701 unknown value is not a number---it accepts arguments of any type. By
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
702 contrast, @code{=} signals an error if the arguments are not numbers or
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
703 markers. However, it is a good idea to use @code{=} if you can, even
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
704 for comparing exact values, because two bignums or ratios with the same
2ba4f06a264d [xemacs-hg @ 2004-04-19 08:02:27 by stephent]
stephent
parents: 1738
diff changeset
705 value will often not be the same object.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
707 On the other hand, some functions, such as the string- and
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
708 buffer-searching functions, will return an integer on success, but
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
709 something else (usually @code{nil}) on failure. If it is known what the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
710 numerical subtype (float, bigfloat, or exact) of the returned object
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
711 will be if it is a number, then the predicate @code{eql} can be used for
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
712 comparison without signaling an error on some expected return values.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
713 Because of canonicalization, @code{eql} can be used to compare a fixnum
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
714 value to something that might be a ratio; if the potential ratio value
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
715 is representable as a fixnum, it will be canonicalized to fixnum before
2091
0221e454fe63 [xemacs-hg @ 2004-05-21 03:27:55 by stephent]
stephent
parents: 2090
diff changeset
716 comparing. However, although floats and bigfloats are of different
0221e454fe63 [xemacs-hg @ 2004-05-21 03:27:55 by stephent]
stephent
parents: 2090
diff changeset
717 types for the purpose of comparisons via @code{eql}, two bigfloats of
0221e454fe63 [xemacs-hg @ 2004-05-21 03:27:55 by stephent]
stephent
parents: 2090
diff changeset
718 different @emph{precision} that are @code{=} will always be @code{eql}.
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
719
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
720 @example
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
721 (eql 2 (string-match "ere" "there"))
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
722 @result{} t
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
723
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
724 (eql 2 (string-match "ere" "three"))
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
725 @result{} nil
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
726
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
727 (eql 2 2.0)
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
728 @result{} nil
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
729
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
730 (= 2 (string-match "ere" "there"))
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
731 @result{} t
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
732
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
733 (= 2 (string-match "ere" "three"))
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
734 @error{} Wrong type argument: number-char-or-marker-p, nil
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
735
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
736 (= 2 2.0)
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
737 @result{} t
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
738 @end example
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
739
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
740
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
741
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 There is another wrinkle: because floating point arithmetic is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 exact, it is often a bad idea to check for equality of two floating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 point values. Usually it is better to test for approximate equality.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 Here's a function to do this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 (defconst fuzz-factor 1.0e-6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 (defun approx-equal (x y)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 (or (and (= x 0) (= y 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 (< (/ (abs (- x y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 (max (abs x) (abs y)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 fuzz-factor)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 @cindex CL note---integers vrs @code{eq}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 @quotation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 @b{Common Lisp note:} Comparing numbers in Common Lisp always requires
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 @code{=} because Common Lisp implements multi-word integers, and two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 distinct integer objects can have the same numeric value. XEmacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 can have just one integer object for any given value because it has a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 limited range of integer values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 @end quotation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 In addition to numbers, all of the following functions also accept
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 characters and markers as arguments, and treat them as their number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 equivalents.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 @defun = number &rest more-numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 This function returns @code{t} if all of its arguments are numerically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 equal, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 (= 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 (= 5 6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 (= 5 5.0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 (= 5 5 6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 @defun /= number &rest more-numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 This function returns @code{t} if no two arguments are numerically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 equal, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 (/= 5 6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 (/= 5 5 6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 (/= 5 6 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 @defun < number &rest more-numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 This function returns @code{t} if the sequence of its arguments is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 monotonically increasing, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 (< 5 6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 (< 5 6 6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 (< 5 6 7)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 @defun <= number &rest more-numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 This function returns @code{t} if the sequence of its arguments is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 monotonically nondecreasing, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 (<= 5 6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 (<= 5 6 6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 (<= 5 6 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 @defun > number &rest more-numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 This function returns @code{t} if the sequence of its arguments is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 monotonically decreasing, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 @defun >= number &rest more-numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 This function returns @code{t} if the sequence of its arguments is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 monotonically nonincreasing, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 @defun max number &rest more-numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 This function returns the largest of its arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 (max 20)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 @result{} 20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 (max 1 2.5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 @result{} 2.5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 (max 1 3 2.5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 @result{} 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 @defun min number &rest more-numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 This function returns the smallest of its arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 (min -4 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 @result{} -4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 @node Numeric Conversions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 @section Numeric Conversions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 @cindex rounding in conversions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 To convert an integer to floating point, use the function @code{float}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 @defun float number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 This returns @var{number} converted to floating point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 If @var{number} is already a floating point number, @code{float} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 it unchanged.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 There are four functions to convert floating point numbers to integers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 they differ in how they round. These functions accept integer arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 also, and return such arguments unchanged.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 @defun truncate number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 This returns @var{number}, converted to an integer by rounding towards
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 zero.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 @defun floor number &optional divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 This returns @var{number}, converted to an integer by rounding downward
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 (towards negative infinity).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 If @var{divisor} is specified, @var{number} is divided by @var{divisor}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 before the floor is taken; this is the division operation that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 corresponds to @code{mod}. An @code{arith-error} results if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 @var{divisor} is 0.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 @defun ceiling number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 This returns @var{number}, converted to an integer by rounding upward
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 (towards positive infinity).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 @defun round number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 This returns @var{number}, converted to an integer by rounding towards the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 nearest integer. Rounding a value equidistant between two integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 may choose the integer closer to zero, or it may prefer an even integer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 depending on your machine.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 @node Arithmetic Operations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 @section Arithmetic Operations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 XEmacs Lisp provides the traditional four arithmetic operations:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 addition, subtraction, multiplication, and division. Remainder and modulus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 functions supplement the division functions. The functions to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 add or subtract 1 are provided because they are traditional in Lisp and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 commonly used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 All of these functions except @code{%} return a floating point value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 if any argument is floating.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 It is important to note that in XEmacs Lisp, arithmetic functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 do not check for overflow. Thus @code{(1+ 134217727)} may evaluate to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 @minus{}134217728, depending on your hardware.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
918 @defun 1+ number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
919 This function returns @var{number} plus one. @var{number} may be a
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
920 number, character or marker. Markers and characters are converted to
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
921 integers.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
922
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 (setq foo 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 @result{} 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 (1+ foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 This function is not analogous to the C operator @code{++}---it does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 increment a variable. It just computes a sum. Thus, if we continue,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 foo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 @result{} 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 If you want to increment the variable, you must use @code{setq},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 (setq foo (1+ foo))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 Now that the @code{cl} package is always available from lisp code, a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 more convenient and natural way to increment a variable is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 @w{@code{(incf foo)}}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
953 @defun 1- number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
954 This function returns @var{number} minus one. @var{number} may be a
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
955 number, character or marker. Markers and characters are converted to
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
956 integers.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 @defun abs number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 This returns the absolute value of @var{number}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
963 @defun + &rest numbers
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 This function adds its arguments together. When given no arguments,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 @code{+} returns 0.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
967 If any of the arguments are characters or markers, they are first
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
968 converted to integers.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
969
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 (+)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 @result{} 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 (+ 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 (+ 1 2 3 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 @result{} 10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
980 @defun - &optional number &rest other-numbers
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 The @code{-} function serves two purposes: negation and subtraction.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 When @code{-} has a single argument, the value is the negative of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 argument. When there are multiple arguments, @code{-} subtracts each of
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
984 the @var{other-numbers} from @var{number}, cumulatively. If there are
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
985 no arguments, an error is signaled.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
986
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
987 If any of the arguments are characters or markers, they are first
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
988 converted to integers.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 (- 10 1 2 3 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 @result{} 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 (- 10)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 @result{} -10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 (-)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 @result{} 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1000 @defun * &rest numbers
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 This function multiplies its arguments together, and returns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 product. When given no arguments, @code{*} returns 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1004 If any of the arguments are characters or markers, they are first
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1005 converted to integers.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1006
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 (*)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 (* 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 (* 1 2 3 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 @result{} 24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1017 @defun / dividend &rest divisors
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1018 The @code{/} function serves two purposes: inversion and division. When
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1019 @code{/} has a single argument, the value is the inverse of the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1020 argument. When there are multiple arguments, @code{/} divides
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1021 @var{dividend} by each of the @var{divisors}, cumulatively, returning
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1022 the quotient. If there are no arguments, an error is signaled.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1024 If none of the arguments are floats, then the result is an integer.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 This means the result has to be rounded. On most machines, the result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 is rounded towards zero after each division, but some machines may round
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 differently with negative arguments. This is because the Lisp function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 @code{/} is implemented using the C division operator, which also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 permits machine-dependent rounding. As a practical matter, all known
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 machines round in the standard fashion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1032 If any of the arguments are characters or markers, they are first
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1033 converted to integers.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1034
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 @cindex @code{arith-error} in division
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 If you divide by 0, an @code{arith-error} error is signaled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 (@xref{Errors}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 (/ 6 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 @result{} 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 (/ 5 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 @result{} 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 (/ 25 3 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 @result{} 4
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1048 (/ 3.0)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1049 @result{} 0.3333333333333333
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 (/ -17 6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 @result{} -2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 The result of @code{(/ -17 6)} could in principle be -3 on some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 machines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 @defun % dividend divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 @cindex remainder
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 This function returns the integer remainder after division of @var{dividend}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 by @var{divisor}. The arguments must be integers or markers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 For negative arguments, the remainder is in principle machine-dependent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 since the quotient is; but in practice, all known machines behave alike.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 An @code{arith-error} results if @var{divisor} is 0.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 (% 9 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 (% -9 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 @result{} -1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 (% 9 -4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 (% -9 -4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 @result{} -1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 For any two integers @var{dividend} and @var{divisor},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 (+ (% @var{dividend} @var{divisor})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 (* (/ @var{dividend} @var{divisor}) @var{divisor}))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 always equals @var{dividend}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 @defun mod dividend divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 @cindex modulus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 This function returns the value of @var{dividend} modulo @var{divisor};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 in other words, the remainder after division of @var{dividend}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 by @var{divisor}, but with the same sign as @var{divisor}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 The arguments must be numbers or markers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 Unlike @code{%}, @code{mod} returns a well-defined result for negative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 arguments. It also permits floating point arguments; it rounds the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 quotient downward (towards minus infinity) to an integer, and uses that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 quotient to compute the remainder.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 An @code{arith-error} results if @var{divisor} is 0.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 (mod 9 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 (mod -9 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 @result{} 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 (mod 9 -4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 @result{} -3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 (mod -9 -4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 @result{} -1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 (mod 5.5 2.5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 @result{} .5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 For any two numbers @var{dividend} and @var{divisor},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 (+ (mod @var{dividend} @var{divisor})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 (* (floor @var{dividend} @var{divisor}) @var{divisor}))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 always equals @var{dividend}, subject to rounding error if either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 argument is floating point. For @code{floor}, see @ref{Numeric
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 Conversions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 @node Rounding Operations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 @section Rounding Operations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 @cindex rounding without conversion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 The functions @code{ffloor}, @code{fceiling}, @code{fround} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 @code{ftruncate} take a floating point argument and return a floating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 point result whose value is a nearby integer. @code{ffloor} returns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 nearest integer below; @code{fceiling}, the nearest integer above;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 @code{ftruncate}, the nearest integer in the direction towards zero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 @code{fround}, the nearest integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1155 @defun ffloor number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1156 This function rounds @var{number} to the next lower integral value, and
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 returns that value as a floating point number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1160 @defun fceiling number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1161 This function rounds @var{number} to the next higher integral value, and
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 returns that value as a floating point number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1165 @defun ftruncate number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1166 This function rounds @var{number} towards zero to an integral value, and
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 returns that value as a floating point number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1170 @defun fround number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1171 This function rounds @var{number} to the nearest integral value,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 and returns that value as a floating point number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 @node Bitwise Operations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 @section Bitwise Operations on Integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 In a computer, an integer is represented as a binary number, a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 sequence of @dfn{bits} (digits which are either zero or one). A bitwise
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 operation acts on the individual bits of such a sequence. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 @dfn{shifting} moves the whole sequence left or right one or more places,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 reproducing the same pattern ``moved over''.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 The bitwise operations in XEmacs Lisp apply only to integers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 @defun lsh integer1 count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 @cindex logical shift
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 @code{lsh}, which is an abbreviation for @dfn{logical shift}, shifts the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 bits in @var{integer1} to the left @var{count} places, or to the right
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 if @var{count} is negative, bringing zeros into the vacated bits. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 @var{count} is negative, @code{lsh} shifts zeros into the leftmost
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 (most-significant) bit, producing a positive result even if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 @var{integer1} is negative. Contrast this with @code{ash}, below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 Here are two examples of @code{lsh}, shifting a pattern of bits one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 place to the left. We show only the low-order eight bits of the binary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 pattern; the rest are all zero.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 (lsh 5 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 @result{} 10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 ;; @r{Decimal 5 becomes decimal 10.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 00000101 @result{} 00001010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 (lsh 7 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 @result{} 14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 ;; @r{Decimal 7 becomes decimal 14.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 00000111 @result{} 00001110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 As the examples illustrate, shifting the pattern of bits one place to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 the left produces a number that is twice the value of the previous
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 Shifting a pattern of bits two places to the left produces results
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 like this (with 8-bit binary numbers):
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 (lsh 3 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 @result{} 12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 ;; @r{Decimal 3 becomes decimal 12.}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1226 00000011 @result{} 00001100
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 On the other hand, shifting one place to the right looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 (lsh 6 -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 @result{} 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 ;; @r{Decimal 6 becomes decimal 3.}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1237 00000110 @result{} 00000011
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 (lsh 5 -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 @result{} 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 ;; @r{Decimal 5 becomes decimal 2.}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1244 00000101 @result{} 00000010
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 As the example illustrates, shifting one place to the right divides the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 value of a positive integer by two, rounding downward.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 The function @code{lsh}, like all XEmacs Lisp arithmetic functions, does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 not check for overflow, so shifting left can discard significant bits
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 and change the sign of the number. For example, left shifting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 134,217,727 produces @minus{}2 on a 28-bit machine:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 (lsh 134217727 1) ; @r{left shift}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 @result{} -2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 In binary, in the 28-bit implementation, the argument looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 ;; @r{Decimal 134,217,727}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1267 0111 1111 1111 1111 1111 1111 1111
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 which becomes the following when left shifted:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 ;; @r{Decimal @minus{}2}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1277 1111 1111 1111 1111 1111 1111 1110
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 @defun ash integer1 count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 @cindex arithmetic shift
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 @code{ash} (@dfn{arithmetic shift}) shifts the bits in @var{integer1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 to the left @var{count} places, or to the right if @var{count}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 is negative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 @code{ash} gives the same results as @code{lsh} except when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 @var{integer1} and @var{count} are both negative. In that case,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 @code{ash} puts ones in the empty bit positions on the left, while
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 @code{lsh} puts zeros in those bit positions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 Thus, with @code{ash}, shifting the pattern of bits one place to the right
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 @group
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1298 (ash -6 -1) @result{} -3
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 ;; @r{Decimal @minus{}6 becomes decimal @minus{}3.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 1111 1111 1111 1111 1111 1111 1010
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1301 @result{}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 1111 1111 1111 1111 1111 1111 1101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 In contrast, shifting the pattern of bits one place to the right with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 @code{lsh} looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 (lsh -6 -1) @result{} 134217725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 ;; @r{Decimal @minus{}6 becomes decimal 134,217,725.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 1111 1111 1111 1111 1111 1111 1010
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1314 @result{}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 0111 1111 1111 1111 1111 1111 1101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 Here are other examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 @c !!! Check if lined up in smallbook format! XDVI shows problem
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 @c with smallbook but not with regular book! --rjc 16mar92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 ; @r{ 28-bit binary values}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 (lsh 5 2) ; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 @result{} 20 ; = @r{0000 0000 0000 0000 0000 0001 0100}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 (ash 5 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 @result{} 20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 (lsh -5 2) ; -5 = @r{1111 1111 1111 1111 1111 1111 1011}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 @result{} -20 ; = @r{1111 1111 1111 1111 1111 1110 1100}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 (ash -5 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 @result{} -20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 (lsh 5 -2) ; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 @result{} 1 ; = @r{0000 0000 0000 0000 0000 0000 0001}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 (ash 5 -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 (lsh -5 -2) ; -5 = @r{1111 1111 1111 1111 1111 1111 1011}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 @result{} 4194302 ; = @r{0011 1111 1111 1111 1111 1111 1110}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 (ash -5 -2) ; -5 = @r{1111 1111 1111 1111 1111 1111 1011}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 @result{} -2 ; = @r{1111 1111 1111 1111 1111 1111 1110}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 @defun logand &rest ints-or-markers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 @cindex logical and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 @cindex bitwise and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 This function returns the ``logical and'' of the arguments: the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 @var{n}th bit is set in the result if, and only if, the @var{n}th bit is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 set in all the arguments. (``Set'' means that the value of the bit is 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 rather than 0.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 For example, using 4-bit binary numbers, the ``logical and'' of 13 and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 12 is 12: 1101 combined with 1100 produces 1100.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 In both the binary numbers, the leftmost two bits are set (i.e., they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 are 1's), so the leftmost two bits of the returned value are set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 However, for the rightmost two bits, each is zero in at least one of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 the arguments, so the rightmost two bits of the returned value are 0's.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 Therefore,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 (logand 13 12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 @result{} 12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 If @code{logand} is not passed any argument, it returns a value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 @minus{}1. This number is an identity element for @code{logand}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 because its binary representation consists entirely of ones. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 @code{logand} is passed just one argument, it returns that argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 ; @r{ 28-bit binary values}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 (logand 14 13) ; 14 = @r{0000 0000 0000 0000 0000 0000 1110}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 ; 13 = @r{0000 0000 0000 0000 0000 0000 1101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 @result{} 12 ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 (logand 14 13 4) ; 14 = @r{0000 0000 0000 0000 0000 0000 1110}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 ; 13 = @r{0000 0000 0000 0000 0000 0000 1101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 ; 4 = @r{0000 0000 0000 0000 0000 0000 0100}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 @result{} 4 ; 4 = @r{0000 0000 0000 0000 0000 0000 0100}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 (logand)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 @result{} -1 ; -1 = @r{1111 1111 1111 1111 1111 1111 1111}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 @defun logior &rest ints-or-markers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 @cindex logical inclusive or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 @cindex bitwise or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 This function returns the ``inclusive or'' of its arguments: the @var{n}th bit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 is set in the result if, and only if, the @var{n}th bit is set in at least
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 one of the arguments. If there are no arguments, the result is zero,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 which is an identity element for this operation. If @code{logior} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 passed just one argument, it returns that argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 ; @r{ 28-bit binary values}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 (logior 12 5) ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 ; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 @result{} 13 ; 13 = @r{0000 0000 0000 0000 0000 0000 1101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 (logior 12 5 7) ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 ; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 ; 7 = @r{0000 0000 0000 0000 0000 0000 0111}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 @result{} 15 ; 15 = @r{0000 0000 0000 0000 0000 0000 1111}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 @defun logxor &rest ints-or-markers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 @cindex bitwise exclusive or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 @cindex logical exclusive or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 This function returns the ``exclusive or'' of its arguments: the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 @var{n}th bit is set in the result if, and only if, the @var{n}th bit is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 set in an odd number of the arguments. If there are no arguments, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 result is 0, which is an identity element for this operation. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 @code{logxor} is passed just one argument, it returns that argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 ; @r{ 28-bit binary values}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 (logxor 12 5) ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 ; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 @result{} 9 ; 9 = @r{0000 0000 0000 0000 0000 0000 1001}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 (logxor 12 5 7) ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 ; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 ; 7 = @r{0000 0000 0000 0000 0000 0000 0111}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 @result{} 14 ; 14 = @r{0000 0000 0000 0000 0000 0000 1110}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 @defun lognot integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 @cindex logical not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 @cindex bitwise not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 This function returns the logical complement of its argument: the @var{n}th
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 bit is one in the result if, and only if, the @var{n}th bit is zero in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 @var{integer}, and vice-versa.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 @example
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1472 (lognot 5)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 @result{} -6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 ;; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 ;; @r{becomes}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 ;; -6 = @r{1111 1111 1111 1111 1111 1111 1010}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 @node Math Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 @section Standard Mathematical Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 @cindex transcendental functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 @cindex mathematical functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 These mathematical functions are available if floating point is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 supported (which is the normal state of affairs). They allow integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 as well as floating point numbers as arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1489 @defun sin number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1490 @defunx cos number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1491 @defunx tan number
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 These are the ordinary trigonometric functions, with argument measured
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 in radians.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1496 @defun asin number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1497 The value of @code{(asin @var{number})} is a number between @minus{}pi/2
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1498 and pi/2 (inclusive) whose sine is @var{number}; if, however, @var{number}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 is out of range (outside [-1, 1]), then the result is a NaN.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1502 @defun acos number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1503 The value of @code{(acos @var{number})} is a number between 0 and pi
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1504 (inclusive) whose cosine is @var{number}; if, however, @var{number}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 is out of range (outside [-1, 1]), then the result is a NaN.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1508 @defun atan number &optional number2
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1509 The value of @code{(atan @var{number})} is a number between @minus{}pi/2
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1510 and pi/2 (exclusive) whose tangent is @var{number}.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1511
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1512 If optional argument @var{number2} is supplied, the function returns
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1513 @code{atan2(@var{number},@var{number2})}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1516 @defun sinh number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1517 @defunx cosh number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1518 @defunx tanh number
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 These are the ordinary hyperbolic trigonometric functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1522 @defun asinh number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1523 @defunx acosh number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1524 @defunx atanh number
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 These are the inverse hyperbolic trigonometric functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1528 @defun exp number
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 This is the exponential function; it returns @i{e} to the power
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1530 @var{number}. @i{e} is a fundamental mathematical constant also called the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 base of natural logarithms.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1534 @defun log number &optional base
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1535 This function returns the logarithm of @var{number}, with base @var{base}.
1738
f43f9ca6c7d9 [xemacs-hg @ 2003-10-10 12:39:27 by stephent]
stephent
parents: 444
diff changeset
1536 If you don't specify @var{base}, the base @code{e} is used. If @var{number}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 is negative, the result is a NaN.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1540 @defun log10 number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1541 This function returns the logarithm of @var{number}, with base 10. If
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1542 @var{number} is negative, the result is a NaN. @code{(log10 @var{x})}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 @equiv{} @code{(log @var{x} 10)}, at least approximately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 @defun expt x y
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 This function returns @var{x} raised to power @var{y}. If both
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 arguments are integers and @var{y} is positive, the result is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 integer; in this case, it is truncated to fit the range of possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 integer values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1553 @defun sqrt number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1554 This returns the square root of @var{number}. If @var{number} is negative,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 the value is a NaN.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1558 @defun cube-root number
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
1559 This returns the cube root of @var{number}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 @node Random Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 @section Random Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 @cindex random numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 A deterministic computer program cannot generate true random numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 For most purposes, @dfn{pseudo-random numbers} suffice. A series of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 pseudo-random numbers is generated in a deterministic fashion. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 numbers are not truly random, but they have certain properties that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 mimic a random series. For example, all possible values occur equally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 often in a pseudo-random series.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 In XEmacs, pseudo-random numbers are generated from a ``seed'' number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 Starting from any given seed, the @code{random} function always
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 generates the same sequence of numbers. XEmacs always starts with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 same seed value, so the sequence of values of @code{random} is actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 the same in each XEmacs run! For example, in one operating system, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 first call to @code{(random)} after you start XEmacs always returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 -1457731, and the second one always returns -7692030. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 repeatability is helpful for debugging.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1582 If you want reasonably unpredictable random numbers, execute
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1583 @code{(random t)}. This chooses a new seed based on the current time of
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1584 day and on XEmacs's process @sc{id} number. (This is not
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1585 cryptographically strong, it's just hard for a @emph{human} to
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1586 anticipate.)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 @defun random &optional limit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 This function returns a pseudo-random integer. Repeated calls return a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 series of pseudo-random integers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 If @var{limit} is a positive integer, the value is chosen to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 nonnegative and less than @var{limit}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 If @var{limit} is @code{t}, it means to choose a new seed based on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 current time of day and on XEmacs's process @sc{id} number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 @c "XEmacs'" is incorrect usage!
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1598 @end defun
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599
2090
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1600 The range of random is implementation-dependent. On any machine, the
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1601 result of @code{(random)} is an arbitrary fixnum, so on 32-bit
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1602 architectures it is normally in the range -2^30 (inclusive) to +2^30
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1603 (exclusive). With the optional integer argument @var{limit}, the result
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1604 is in the range 0 (inclusive) to @var{limit} (exclusive). Note this is
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1605 regardless of the presence of the bignum extension.
e52c5a5c6a7d [xemacs-hg @ 2004-05-21 01:21:08 by stephent]
stephent
parents: 2033
diff changeset
1606