1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
|
@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
@c See the file elisp.texi for copying conditions.
@setfilename ../info/numbers
@node Numbers, Strings and Characters, Lisp Data Types, Top
@chapter Numbers
@cindex integers
@cindex numbers
GNU Emacs supports two numeric data types: @dfn{integers} and
@dfn{floating point numbers}. Integers are whole numbers such as
@minus{}3, 0, 7, 13, and 511. Their values are exact. Floating point
numbers are numbers with fractional parts, such as @minus{}4.5, 0.0, or
2.71828. They can also be expressed in exponential notation:
1.5e2 equals 150; in this example, @samp{e2} stands for ten to the
second power, and is multiplied by 1.5. Floating point values are not
exact; they have a fixed, limited amount of precision.
Support for floating point numbers is a new feature in Emacs 19, and it
is controlled by a separate compilation option, so you may encounter a site
where Emacs does not support them.
@menu
* Integer Basics:: Representation and range of integers.
* Float Basics:: Representation and range of floating point.
* Predicates on Numbers:: Testing for numbers.
* Comparison of Numbers:: Equality and inequality predicates.
* Numeric Conversions:: Converting float to integer and vice versa.
* Arithmetic Operations:: How to add, subtract, multiply and divide.
* Rounding Operations:: Explicitly rounding floating point numbers.
* Bitwise Operations:: Logical and, or, not, shifting.
* Math Functions:: Trig, exponential and logarithmic functions.
* Random Numbers:: Obtaining random integers, predictable or not.
@end menu
@node Integer Basics
@comment node-name, next, previous, up
@section Integer Basics
The range of values for an integer depends on the machine. The
minimum range is @minus{}134217728 to 134217727 (28 bits; i.e.,
@ifinfo
-2**27
@end ifinfo
@tex
$-2^{27}$
@end tex
to
@ifinfo
2**27 - 1),
@end ifinfo
@tex
$2^{27}-1$),
@end tex
but some machines may provide a wider range. Many examples in this
chapter assume an integer has 28 bits.
@cindex overflow
The Lisp reader reads an integer as a sequence of digits with optional
initial sign and optional final period.
@example
1 ; @r{The integer 1.}
1. ; @r{The integer 1.}
+1 ; @r{Also the integer 1.}
-1 ; @r{The integer @minus{}1.}
268435457 ; @r{Also the integer 1, due to overflow.}
0 ; @r{The integer 0.}
-0 ; @r{The integer 0.}
@end example
To understand how various functions work on integers, especially the
bitwise operators (@pxref{Bitwise Operations}), it is often helpful to
view the numbers in their binary form.
In 28-bit binary, the decimal integer 5 looks like this:
@example
0000 0000 0000 0000 0000 0000 0101
@end example
@noindent
(We have inserted spaces between groups of 4 bits, and two spaces
between groups of 8 bits, to make the binary integer easier to read.)
The integer @minus{}1 looks like this:
@example
1111 1111 1111 1111 1111 1111 1111
@end example
@noindent
@cindex two's complement
@minus{}1 is represented as 28 ones. (This is called @dfn{two's
complement} notation.)
The negative integer, @minus{}5, is creating by subtracting 4 from
@minus{}1. In binary, the decimal integer 4 is 100. Consequently,
@minus{}5 looks like this:
@example
1111 1111 1111 1111 1111 1111 1011
@end example
In this implementation, the largest 28-bit binary integer value is
134,217,727 in decimal. In binary, it looks like this:
@example
0111 1111 1111 1111 1111 1111 1111
@end example
Since the arithmetic functions do not check whether integers go
outside their range, when you add 1 to 134,217,727, the value is the
negative integer @minus{}134,217,728:
@example
(+ 1 134217727)
@result{} -134217728
@result{} 1000 0000 0000 0000 0000 0000 0000
@end example
Many of the following functions accept markers for arguments as well
as integers. (@xref{Markers}.) More precisely, the actual arguments to
such functions may be either integers or markers, which is why we often
give these arguments the name @var{int-or-marker}. When the argument
value is a marker, its position value is used and its buffer is ignored.
@ignore
In version 19, except where @emph{integer} is specified as an
argument, all of the functions for markers and integers also work for
floating point numbers.
@end ignore
@node Float Basics
@section Floating Point Basics
@cindex @code{LISP_FLOAT_TYPE} configuration macro
Emacs version 19 supports floating point numbers, if compiled with the
macro @code{LISP_FLOAT_TYPE} defined. The precise range of floating
point numbers is machine-specific; it is the same as the range of the C
data type @code{double} on the machine in question.
The printed representation for floating point numbers requires either
a decimal point (with at least one digit following), an exponent, or
both. For example, @samp{1500.0}, @samp{15e2}, @samp{15.0e2},
@samp{1.5e3}, and @samp{.15e4} are five ways of writing a floating point
number whose value is 1500. They are all equivalent. You can also use
a minus sign to write negative floating point numbers, as in
@samp{-1.0}.
@cindex IEEE floating point
@cindex positive infinity
@cindex negative infinity
@cindex infinity
@cindex NaN
Most modern computers support the IEEE floating point standard, which
provides for positive infinity and negative infinity as floating point
values. It also provides for a class of values called NaN or
``not-a-number''; numerical functions return such values in cases where
there is no correct answer. For example, @code{(sqrt -1.0)} returns a
NaN. For practical purposes, there's no significant difference between
different NaN values in Emacs Lisp, and there's no rule for precisely
which NaN value should be used in a particular case, so this manual
doesn't try to distinguish them. Emacs Lisp has no read syntax for NaNs
or infinities; perhaps we should create a syntax in the future.
You can use @code{logb} to extract the binary exponent of a floating
point number (or estimate the logarithm of an integer):
@defun logb number
This function returns the binary exponent of @var{number}. More
precisely, the value is the logarithm of @var{number} base 2, rounded
down to an integer.
@end defun
@node Predicates on Numbers
@section Type Predicates for Numbers
The functions in this section test whether the argument is a number or
whether it is a certain sort of number. The functions @code{integerp}
and @code{floatp} can take any type of Lisp object as argument (the
predicates would not be of much use otherwise); but the @code{zerop}
predicate requires a number as its argument. See also
@code{integer-or-marker-p} and @code{number-or-marker-p}, in
@ref{Predicates on Markers}.
@defun floatp object
This predicate tests whether its argument is a floating point
number and returns @code{t} if so, @code{nil} otherwise.
@code{floatp} does not exist in Emacs versions 18 and earlier.
@end defun
@defun integerp object
This predicate tests whether its argument is an integer, and returns
@code{t} if so, @code{nil} otherwise.
@end defun
@defun numberp object
This predicate tests whether its argument is a number (either integer or
floating point), and returns @code{t} if so, @code{nil} otherwise.
@end defun
@defun wholenump object
@cindex natural numbers
The @code{wholenump} predicate (whose name comes from the phrase
``whole-number-p'') tests to see whether its argument is a nonnegative
integer, and returns @code{t} if so, @code{nil} otherwise. 0 is
considered non-negative.
@findex natnump
@code{natnump} is an obsolete synonym for @code{wholenump}.
@end defun
@defun zerop number
This predicate tests whether its argument is zero, and returns @code{t}
if so, @code{nil} otherwise. The argument must be a number.
These two forms are equivalent: @code{(zerop x)} @equiv{} @code{(= x 0)}.
@end defun
@node Comparison of Numbers
@section Comparison of Numbers
@cindex number equality
To test numbers for numerical equality, you should normally use
@code{=}, not @code{eq}. There can be many distinct floating point
number objects with the same numeric value. If you use @code{eq} to
compare them, then you test whether two values are the same
@emph{object}. By contrast, @code{=} compares only the numeric values
of the objects.
At present, each integer value has a unique Lisp object in Emacs Lisp.
Therefore, @code{eq} is equivalent @code{=} where integers are
concerned. It is sometimes convenient to use @code{eq} for comparing an
unknown value with an integer, because @code{eq} does not report an
error if the unknown value is not a number---it accepts arguments of any
type. By contrast, @code{=} signals an error if the arguments are not
numbers or markers. However, it is a good idea to use @code{=} if you
can, even for comparing integers, just in case we change the
representation of integers in a future Emacs version.
There is another wrinkle: because floating point arithmetic is not
exact, it is often a bad idea to check for equality of two floating
point values. Usually it is better to test for approximate equality.
Here's a function to do this:
@example
(defvar fuzz-factor 1.0e-6)
(defun approx-equal (x y)
(or (and (= x 0) (= y 0))
(< (/ (abs (- x y))
(max (abs x) (abs y)))
fuzz-factor)))
@end example
@cindex CL note---integers vrs @code{eq}
@quotation
@b{Common Lisp note:} Comparing numbers in Common Lisp always requires
@code{=} because Common Lisp implements multi-word integers, and two
distinct integer objects can have the same numeric value. Emacs Lisp
can have just one integer object for any given value because it has a
limited range of integer values.
@end quotation
@defun = number-or-marker1 number-or-marker2
This function tests whether its arguments are numerically equal, and
returns @code{t} if so, @code{nil} otherwise.
@end defun
@defun /= number-or-marker1 number-or-marker2
This function tests whether its arguments are numerically equal, and
returns @code{t} if they are not, and @code{nil} if they are.
@end defun
@defun < number-or-marker1 number-or-marker2
This function tests whether its first argument is strictly less than
its second argument. It returns @code{t} if so, @code{nil} otherwise.
@end defun
@defun <= number-or-marker1 number-or-marker2
This function tests whether its first argument is less than or equal
to its second argument. It returns @code{t} if so, @code{nil}
otherwise.
@end defun
@defun > number-or-marker1 number-or-marker2
This function tests whether its first argument is strictly greater
than its second argument. It returns @code{t} if so, @code{nil}
otherwise.
@end defun
@defun >= number-or-marker1 number-or-marker2
This function tests whether its first argument is greater than or
equal to its second argument. It returns @code{t} if so, @code{nil}
otherwise.
@end defun
@defun max number-or-marker &rest numbers-or-markers
This function returns the largest of its arguments.
@example
(max 20)
@result{} 20
(max 1 2.5)
@result{} 2.5
(max 1 3 2.5)
@result{} 3
@end example
@end defun
@defun min number-or-marker &rest numbers-or-markers
This function returns the smallest of its arguments.
@example
(min -4 1)
@result{} -4
@end example
@end defun
@node Numeric Conversions
@section Numeric Conversions
@cindex rounding in conversions
To convert an integer to floating point, use the function @code{float}.
@defun float number
This returns @var{number} converted to floating point.
If @var{number} is already a floating point number, @code{float} returns
it unchanged.
@end defun
There are four functions to convert floating point numbers to integers;
they differ in how they round. These functions accept integer arguments
also, and return such arguments unchanged.
@defun truncate number
This returns @var{number}, converted to an integer by rounding towards
zero.
@end defun
@defun floor number &optional divisor
This returns @var{number}, converted to an integer by rounding downward
(towards negative infinity).
If @var{divisor} is specified, @var{number} is divided by @var{divisor}
before the floor is taken; this is the division operation that
corresponds to @code{mod}. An @code{arith-error} results if
@var{divisor} is 0.
@end defun
@defun ceiling number
This returns @var{number}, converted to an integer by rounding upward
(towards positive infinity).
@end defun
@defun round number
This returns @var{number}, converted to an integer by rounding towards the
nearest integer. Rounding a value equidistant between two integers
may choose the integer closer to zero, or it may prefer an even integer,
depending on your machine.
@end defun
@node Arithmetic Operations
@section Arithmetic Operations
Emacs Lisp provides the traditional four arithmetic operations:
addition, subtraction, multiplication, and division. Remainder and modulus
functions supplement the division functions. The functions to
add or subtract 1 are provided because they are traditional in Lisp and
commonly used.
All of these functions except @code{%} return a floating point value
if any argument is floating.
It is important to note that in GNU Emacs Lisp, arithmetic functions
do not check for overflow. Thus @code{(1+ 134217727)} may evaluate to
@minus{}134217728, depending on your hardware.
@defun 1+ number-or-marker
This function returns @var{number-or-marker} plus 1.
For example,
@example
(setq foo 4)
@result{} 4
(1+ foo)
@result{} 5
@end example
This function is not analogous to the C operator @code{++}---it does not
increment a variable. It just computes a sum. Thus, if we continue,
@example
foo
@result{} 4
@end example
If you want to increment the variable, you must use @code{setq},
like this:
@example
(setq foo (1+ foo))
@result{} 5
@end example
@end defun
@defun 1- number-or-marker
This function returns @var{number-or-marker} minus 1.
@end defun
@defun abs number
This returns the absolute value of @var{number}.
@end defun
@defun + &rest numbers-or-markers
This function adds its arguments together. When given no arguments,
@code{+} returns 0.
@example
(+)
@result{} 0
(+ 1)
@result{} 1
(+ 1 2 3 4)
@result{} 10
@end example
@end defun
@defun - &optional number-or-marker &rest other-numbers-or-markers
The @code{-} function serves two purposes: negation and subtraction.
When @code{-} has a single argument, the value is the negative of the
argument. When there are multiple arguments, @code{-} subtracts each of
the @var{other-numbers-or-markers} from @var{number-or-marker},
cumulatively. If there are no arguments, the result is 0.
@example
(- 10 1 2 3 4)
@result{} 0
(- 10)
@result{} -10
(-)
@result{} 0
@end example
@end defun
@defun * &rest numbers-or-markers
This function multiplies its arguments together, and returns the
product. When given no arguments, @code{*} returns 1.
@example
(*)
@result{} 1
(* 1)
@result{} 1
(* 1 2 3 4)
@result{} 24
@end example
@end defun
@defun / dividend divisor &rest divisors
This function divides @var{dividend} by @var{divisor} and returns the
quotient. If there are additional arguments @var{divisors}, then it
divides @var{dividend} by each divisor in turn. Each argument may be a
number or a marker.
If all the arguments are integers, then the result is an integer too.
This means the result has to be rounded. On most machines, the result
is rounded towards zero after each division, but some machines may round
differently with negative arguments. This is because the Lisp function
@code{/} is implemented using the C division operator, which also
permits machine-dependent rounding. As a practical matter, all known
machines round in the standard fashion.
@cindex @code{arith-error} in division
If you divide by 0, an @code{arith-error} error is signaled.
(@xref{Errors}.)
@example
@group
(/ 6 2)
@result{} 3
@end group
(/ 5 2)
@result{} 2
(/ 25 3 2)
@result{} 4
(/ -17 6)
@result{} -2
@end example
The result of @code{(/ -17 6)} could in principle be -3 on some
machines.
@end defun
@defun % dividend divisor
@cindex remainder
This function returns the integer remainder after division of @var{dividend}
by @var{divisor}. The arguments must be integers or markers.
For negative arguments, the remainder is in principle machine-dependent
since the quotient is; but in practice, all known machines behave alike.
An @code{arith-error} results if @var{divisor} is 0.
@example
(% 9 4)
@result{} 1
(% -9 4)
@result{} -1
(% 9 -4)
@result{} 1
(% -9 -4)
@result{} -1
@end example
For any two integers @var{dividend} and @var{divisor},
@example
@group
(+ (% @var{dividend} @var{divisor})
(* (/ @var{dividend} @var{divisor}) @var{divisor}))
@end group
@end example
@noindent
always equals @var{dividend}.
@end defun
@defun mod dividend divisor
@cindex modulus
This function returns the value of @var{dividend} modulo @var{divisor};
in other words, the remainder after division of @var{dividend}
by @var{divisor}, but with the same sign as @var{divisor}.
The arguments must be numbers or markers.
Unlike @code{%}, @code{mod} returns a well-defined result for negative
arguments. It also permits floating point arguments; it rounds the
quotient downward (towards minus infinity) to an integer, and uses that
quotient to compute the remainder.
An @code{arith-error} results if @var{divisor} is 0.
@example
@group
(mod 9 4)
@result{} 1
@end group
@group
(mod -9 4)
@result{} 3
@end group
@group
(mod 9 -4)
@result{} -3
@end group
@group
(mod -9 -4)
@result{} -1
@end group
@group
(mod 5.5 2.5)
@result{} .5
@end group
@end example
For any two numbers @var{dividend} and @var{divisor},
@example
@group
(+ (mod @var{dividend} @var{divisor})
(* (floor @var{dividend} @var{divisor}) @var{divisor}))
@end group
@end example
@noindent
always equals @var{dividend}, subject to rounding error if either
argument is floating point. For @code{floor}, see @ref{Numeric
Conversions}.
@end defun
@node Rounding Operations
@section Rounding Operations
@cindex rounding without conversion
The functions @code{ffloor}, @code{fceiling}, @code{fround} and
@code{ftruncate} take a floating point argument and return a floating
point result whose value is a nearby integer. @code{ffloor} returns the
nearest integer below; @code{fceiling}, the nearest integer above;
@code{ftruncate}, the nearest integer in the direction towards zero;
@code{fround}, the nearest integer.
@defun ffloor float
This function rounds @var{float} to the next lower integral value, and
returns that value as a floating point number.
@end defun
@defun fceiling float
This function rounds @var{float} to the next higher integral value, and
returns that value as a floating point number.
@end defun
@defun ftruncate float
This function rounds @var{float} towards zero to an integral value, and
returns that value as a floating point number.
@end defun
@defun fround float
This function rounds @var{float} to the nearest integral value,
and returns that value as a floating point number.
@end defun
@node Bitwise Operations
@section Bitwise Operations on Integers
In a computer, an integer is represented as a binary number, a
sequence of @dfn{bits} (digits which are either zero or one). A bitwise
operation acts on the individual bits of such a sequence. For example,
@dfn{shifting} moves the whole sequence left or right one or more places,
reproducing the same pattern ``moved over''.
The bitwise operations in Emacs Lisp apply only to integers.
@defun lsh integer1 count
@cindex logical shift
@code{lsh}, which is an abbreviation for @dfn{logical shift}, shifts the
bits in @var{integer1} to the left @var{count} places, or to the right
if @var{count} is negative, bringing zeros into the vacated bits. If
@var{count} is negative, @code{lsh} shifts zeros into the leftmost
(most-significant) bit, producing a positive result even if
@var{integer1} is negative. Contrast this with @code{ash}, below.
Here are two examples of @code{lsh}, shifting a pattern of bits one
place to the left. We show only the low-order eight bits of the binary
pattern; the rest are all zero.
@example
@group
(lsh 5 1)
@result{} 10
;; @r{Decimal 5 becomes decimal 10.}
00000101 @result{} 00001010
(lsh 7 1)
@result{} 14
;; @r{Decimal 7 becomes decimal 14.}
00000111 @result{} 00001110
@end group
@end example
@noindent
As the examples illustrate, shifting the pattern of bits one place to
the left produces a number that is twice the value of the previous
number.
Shifting a pattern of bits two places to the left produces results
like this (with 8-bit binary numbers):
@example
@group
(lsh 3 2)
@result{} 12
;; @r{Decimal 3 becomes decimal 12.}
00000011 @result{} 00001100
@end group
@end example
On the other hand, shifting one place to the right looks like this:
@example
@group
(lsh 6 -1)
@result{} 3
;; @r{Decimal 6 becomes decimal 3.}
00000110 @result{} 00000011
@end group
@group
(lsh 5 -1)
@result{} 2
;; @r{Decimal 5 becomes decimal 2.}
00000101 @result{} 00000010
@end group
@end example
@noindent
As the example illustrates, shifting one place to the right divides the
value of a positive integer by two, rounding downward.
The function @code{lsh}, like all Emacs Lisp arithmetic functions, does
not check for overflow, so shifting left can discard significant bits
and change the sign of the number. For example, left shifting
134,217,727 produces @minus{}2 on a 28-bit machine:
@example
(lsh 134217727 1) ; @r{left shift}
@result{} -2
@end example
In binary, in the 28-bit implementation, the argument looks like this:
@example
@group
;; @r{Decimal 134,217,727}
0111 1111 1111 1111 1111 1111 1111
@end group
@end example
@noindent
which becomes the following when left shifted:
@example
@group
;; @r{Decimal @minus{}2}
1111 1111 1111 1111 1111 1111 1110
@end group
@end example
@end defun
@defun ash integer1 count
@cindex arithmetic shift
@code{ash} (@dfn{arithmetic shift}) shifts the bits in @var{integer1}
to the left @var{count} places, or to the right if @var{count}
is negative.
@code{ash} gives the same results as @code{lsh} except when
@var{integer1} and @var{count} are both negative. In that case,
@code{ash} puts ones in the empty bit positions on the left, while
@code{lsh} puts zeros in those bit positions.
Thus, with @code{ash}, shifting the pattern of bits one place to the right
looks like this:
@example
@group
(ash -6 -1) @result{} -3
;; @r{Decimal @minus{}6 becomes decimal @minus{}3.}
1111 1111 1111 1111 1111 1111 1010
@result{}
1111 1111 1111 1111 1111 1111 1101
@end group
@end example
In contrast, shifting the pattern of bits one place to the right with
@code{lsh} looks like this:
@example
@group
(lsh -6 -1) @result{} 134217725
;; @r{Decimal @minus{}6 becomes decimal 134,217,725.}
1111 1111 1111 1111 1111 1111 1010
@result{}
0111 1111 1111 1111 1111 1111 1101
@end group
@end example
Here are other examples:
@c !!! Check if lined up in smallbook format! XDVI shows problem
@c with smallbook but not with regular book! --rjc 16mar92
@smallexample
@group
; @r{ 28-bit binary values}
(lsh 5 2) ; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
@result{} 20 ; = @r{0000 0000 0000 0000 0000 0001 0100}
@end group
@group
(ash 5 2)
@result{} 20
(lsh -5 2) ; -5 = @r{1111 1111 1111 1111 1111 1111 1011}
@result{} -20 ; = @r{1111 1111 1111 1111 1111 1110 1100}
(ash -5 2)
@result{} -20
@end group
@group
(lsh 5 -2) ; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
@result{} 1 ; = @r{0000 0000 0000 0000 0000 0000 0001}
@end group
@group
(ash 5 -2)
@result{} 1
@end group
@group
(lsh -5 -2) ; -5 = @r{1111 1111 1111 1111 1111 1111 1011}
@result{} 4194302 ; = @r{0011 1111 1111 1111 1111 1111 1110}
@end group
@group
(ash -5 -2) ; -5 = @r{1111 1111 1111 1111 1111 1111 1011}
@result{} -2 ; = @r{1111 1111 1111 1111 1111 1111 1110}
@end group
@end smallexample
@end defun
@defun logand &rest ints-or-markers
@cindex logical and
@cindex bitwise and
This function returns the ``logical and'' of the arguments: the
@var{n}th bit is set in the result if, and only if, the @var{n}th bit is
set in all the arguments. (``Set'' means that the value of the bit is 1
rather than 0.)
For example, using 4-bit binary numbers, the ``logical and'' of 13 and
12 is 12: 1101 combined with 1100 produces 1100.
In both the binary numbers, the leftmost two bits are set (i.e., they
are 1's), so the leftmost two bits of the returned value are set.
However, for the rightmost two bits, each is zero in at least one of
the arguments, so the rightmost two bits of the returned value are 0's.
@noindent
Therefore,
@example
@group
(logand 13 12)
@result{} 12
@end group
@end example
If @code{logand} is not passed any argument, it returns a value of
@minus{}1. This number is an identity element for @code{logand}
because its binary representation consists entirely of ones. If
@code{logand} is passed just one argument, it returns that argument.
@smallexample
@group
; @r{ 28-bit binary values}
(logand 14 13) ; 14 = @r{0000 0000 0000 0000 0000 0000 1110}
; 13 = @r{0000 0000 0000 0000 0000 0000 1101}
@result{} 12 ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
@end group
@group
(logand 14 13 4) ; 14 = @r{0000 0000 0000 0000 0000 0000 1110}
; 13 = @r{0000 0000 0000 0000 0000 0000 1101}
; 4 = @r{0000 0000 0000 0000 0000 0000 0100}
@result{} 4 ; 4 = @r{0000 0000 0000 0000 0000 0000 0100}
@end group
@group
(logand)
@result{} -1 ; -1 = @r{1111 1111 1111 1111 1111 1111 1111}
@end group
@end smallexample
@end defun
@defun logior &rest ints-or-markers
@cindex logical inclusive or
@cindex bitwise or
This function returns the ``inclusive or'' of its arguments: the @var{n}th bit
is set in the result if, and only if, the @var{n}th bit is set in at least
one of the arguments. If there are no arguments, the result is zero,
which is an identity element for this operation. If @code{logior} is
passed just one argument, it returns that argument.
@smallexample
@group
; @r{ 28-bit binary values}
(logior 12 5) ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
@result{} 13 ; 13 = @r{0000 0000 0000 0000 0000 0000 1101}
@end group
@group
(logior 12 5 7) ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
; 7 = @r{0000 0000 0000 0000 0000 0000 0111}
@result{} 15 ; 15 = @r{0000 0000 0000 0000 0000 0000 1111}
@end group
@end smallexample
@end defun
@defun logxor &rest ints-or-markers
@cindex bitwise exclusive or
@cindex logical exclusive or
This function returns the ``exclusive or'' of its arguments: the
@var{n}th bit is set in the result if, and only if, the @var{n}th bit is
set in an odd number of the arguments. If there are no arguments, the
result is 0, which is an identity element for this operation. If
@code{logxor} is passed just one argument, it returns that argument.
@smallexample
@group
; @r{ 28-bit binary values}
(logxor 12 5) ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
@result{} 9 ; 9 = @r{0000 0000 0000 0000 0000 0000 1001}
@end group
@group
(logxor 12 5 7) ; 12 = @r{0000 0000 0000 0000 0000 0000 1100}
; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
; 7 = @r{0000 0000 0000 0000 0000 0000 0111}
@result{} 14 ; 14 = @r{0000 0000 0000 0000 0000 0000 1110}
@end group
@end smallexample
@end defun
@defun lognot integer
@cindex logical not
@cindex bitwise not
This function returns the logical complement of its argument: the @var{n}th
bit is one in the result if, and only if, the @var{n}th bit is zero in
@var{integer}, and vice-versa.
@example
(lognot 5)
@result{} -6
;; 5 = @r{0000 0000 0000 0000 0000 0000 0101}
;; @r{becomes}
;; -6 = @r{1111 1111 1111 1111 1111 1111 1010}
@end example
@end defun
@node Math Functions
@section Standard Mathematical Functions
@cindex transcendental functions
@cindex mathematical functions
These mathematical functions are available if floating point is
supported. They allow integers as well as floating point numbers
as arguments.
@defun sin arg
@defunx cos arg
@defunx tan arg
These are the ordinary trigonometric functions, with argument measured
in radians.
@end defun
@defun asin arg
The value of @code{(asin @var{arg})} is a number between @minus{}pi/2
and pi/2 (inclusive) whose sine is @var{arg}; if, however, @var{arg}
is out of range (outside [-1, 1]), then the result is a NaN.
@end defun
@defun acos arg
The value of @code{(acos @var{arg})} is a number between 0 and pi
(inclusive) whose cosine is @var{arg}; if, however, @var{arg}
is out of range (outside [-1, 1]), then the result is a NaN.
@end defun
@defun atan arg
The value of @code{(atan @var{arg})} is a number between @minus{}pi/2
and pi/2 (exclusive) whose tangent is @var{arg}.
@end defun
@defun exp arg
This is the exponential function; it returns @i{e} to the power
@var{arg}. @i{e} is a fundamental mathematical constant also called the
base of natural logarithms.
@end defun
@defun log arg &optional base
This function returns the logarithm of @var{arg}, with base @var{base}.
If you don't specify @var{base}, the base @var{e} is used. If @var{arg}
is negative, the result is a NaN.
@end defun
@ignore
@defun expm1 arg
This function returns @code{(1- (exp @var{arg}))}, but it is more
accurate than that when @var{arg} is negative and @code{(exp @var{arg})}
is close to 1.
@end defun
@defun log1p arg
This function returns @code{(log (1+ @var{arg}))}, but it is more
accurate than that when @var{arg} is so small that adding 1 to it would
lose accuracy.
@end defun
@end ignore
@defun log10 arg
This function returns the logarithm of @var{arg}, with base 10. If
@var{arg} is negative, the result is a NaN. @code{(log10 @var{x})}
@equiv{} @code{(log @var{x} 10)}, at least approximately.
@end defun
@defun expt x y
This function returns @var{x} raised to power @var{y}. If both
arguments are integers and @var{y} is positive, the result is an
integer; in this case, it is truncated to fit the range of possible
integer values.
@end defun
@defun sqrt arg
This returns the square root of @var{arg}. If @var{arg} is negative,
the value is a NaN.
@end defun
@node Random Numbers
@section Random Numbers
@cindex random numbers
A deterministic computer program cannot generate true random numbers.
For most purposes, @dfn{pseudo-random numbers} suffice. A series of
pseudo-random numbers is generated in a deterministic fashion. The
numbers are not truly random, but they have certain properties that
mimic a random series. For example, all possible values occur equally
often in a pseudo-random series.
In Emacs, pseudo-random numbers are generated from a ``seed'' number.
Starting from any given seed, the @code{random} function always
generates the same sequence of numbers. Emacs always starts with the
same seed value, so the sequence of values of @code{random} is actually
the same in each Emacs run! For example, in one operating system, the
first call to @code{(random)} after you start Emacs always returns
-1457731, and the second one always returns -7692030. This
repeatability is helpful for debugging.
If you want truly unpredictable random numbers, execute @code{(random
t)}. This chooses a new seed based on the current time of day and on
Emacs's process @sc{id} number.
@defun random &optional limit
This function returns a pseudo-random integer. Repeated calls return a
series of pseudo-random integers.
If @var{limit} is a positive integer, the value is chosen to be
nonnegative and less than @var{limit}.
If @var{limit} is @code{t}, it means to choose a new seed based on the
current time of day and on Emacs's process @sc{id} number.
@c "Emacs'" is incorrect usage!
On some machines, any integer representable in Lisp may be the result
of @code{random}. On other machines, the result can never be larger
than a certain maximum or less than a certain (negative) minimum.
@end defun
|