2
* Copyright (c) 2001 by The XFree86 Project, Inc.
4
* Permission is hereby granted, free of charge, to any person obtaining a
5
* copy of this software and associated documentation files (the "Software"),
6
* to deal in the Software without restriction, including without limitation
7
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
* and/or sell copies of the Software, and to permit persons to whom the
9
* Software is furnished to do so, subject to the following conditions:
11
* The above copyright notice and this permission notice shall be included in
12
* all copies or substantial portions of the Software.
14
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17
* THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
* Except as contained in this notice, the name of the XFree86 Project shall
23
* not be used in advertising or otherwise to promote the sale, use or other
24
* dealings in this Software without prior written authorization from the
27
* Author: Paulo César Pereira de Andrade
30
/* $XFree86: xc/programs/xedit/lisp/math.c,v 1.23tsi Exp $ */
32
#include "lisp/math.h"
33
#include "lisp/private.h"
36
# define finite(x) isfinite(x)
42
static LispObj *LispDivide(LispBuiltin*, int, int);
47
static LispObj *obj_zero, *obj_one;
48
LispObj *Ocomplex, *Oequal_;
50
LispObj *Oshort_float, *Osingle_float, *Odouble_float, *Olong_float;
52
Atom_id Sdefault_float_format;
57
#include "lisp/mathimp.c"
62
LispObj *object, *result;
64
mp_set_malloc(LispMalloc);
65
mp_set_calloc(LispCalloc);
66
mp_set_realloc(LispRealloc);
67
mp_set_free(LispFree);
73
Oequal_ = STATIC_ATOM("=");
74
Ocomplex = STATIC_ATOM(Scomplex);
75
Oshort_float = STATIC_ATOM("SHORT-FLOAT");
76
LispExportSymbol(Oshort_float);
77
Osingle_float = STATIC_ATOM("SINGLE-FLOAT");
78
LispExportSymbol(Osingle_float);
79
Odouble_float = STATIC_ATOM("DOUBLE-FLOAT");
80
LispExportSymbol(Odouble_float);
81
Olong_float = STATIC_ATOM("LONG-FLOAT");
82
LispExportSymbol(Olong_float);
84
object = STATIC_ATOM("*DEFAULT-FLOAT-FORMAT*");
85
LispProclaimSpecial(object, Odouble_float, NIL);
86
LispExportSymbol(object);
87
Sdefault_float_format = ATOMID(object);
89
object = STATIC_ATOM("PI");
91
LispProclaimSpecial(object, result, NIL);
92
LispExportSymbol(object);
94
object = STATIC_ATOM("MOST-POSITIVE-FIXNUM");
95
LispDefconstant(object, FIXNUM(MOST_POSITIVE_FIXNUM), NIL);
96
LispExportSymbol(object);
98
object = STATIC_ATOM("MOST-NEGATIVE-FIXNUM");
99
LispDefconstant(object, FIXNUM(MOST_NEGATIVE_FIXNUM), NIL);
100
LispExportSymbol(object);
104
Lisp_Mul(LispBuiltin *builtin)
110
LispObj *number, *numbers;
112
numbers = ARGUMENT(0);
114
if (CONSP(numbers)) {
115
number = CAR(numbers);
117
numbers = CDR(numbers);
118
if (!CONSP(numbers)) {
119
CHECK_NUMBER(number);
126
set_number_object(&num, number);
128
mul_number_object(&num, CAR(numbers));
129
numbers = CDR(numbers);
130
} while (CONSP(numbers));
132
return (make_number_object(&num));
136
Lisp_Plus(LispBuiltin *builtin)
142
LispObj *number, *numbers;
144
numbers = ARGUMENT(0);
146
if (CONSP(numbers)) {
147
number = CAR(numbers);
149
numbers = CDR(numbers);
150
if (!CONSP(numbers)) {
151
CHECK_NUMBER(number);
158
set_number_object(&num, number);
160
add_number_object(&num, CAR(numbers));
161
numbers = CDR(numbers);
162
} while (CONSP(numbers));
164
return (make_number_object(&num));
168
Lisp_Minus(LispBuiltin *builtin)
170
- number &rest more_numbers
174
LispObj *number, *more_numbers;
176
more_numbers = ARGUMENT(1);
177
number = ARGUMENT(0);
179
set_number_object(&num, number);
180
if (!CONSP(more_numbers)) {
183
return (make_number_object(&num));
186
sub_number_object(&num, CAR(more_numbers));
187
more_numbers = CDR(more_numbers);
188
} while (CONSP(more_numbers));
190
return (make_number_object(&num));
194
Lisp_Div(LispBuiltin *builtin)
196
/ number &rest more_numbers
200
LispObj *number, *more_numbers;
202
more_numbers = ARGUMENT(1);
203
number = ARGUMENT(0);
205
if (CONSP(more_numbers))
206
set_number_object(&num, number);
209
num.real.type = N_FIXNUM;
210
num.real.data.fixnum = 1;
211
goto div_one_argument;
215
number = CAR(more_numbers);
216
more_numbers = CDR(more_numbers);
219
div_number_object(&num, number);
220
if (!CONSP(more_numbers))
224
return (make_number_object(&num));
228
Lisp_OnePlus(LispBuiltin *builtin)
236
number = ARGUMENT(0);
238
num.real.type = N_FIXNUM;
239
num.real.data.fixnum = 1;
240
add_number_object(&num, number);
242
return (make_number_object(&num));
246
Lisp_OneMinus(LispBuiltin *builtin)
254
number = ARGUMENT(0);
256
num.real.type = N_FIXNUM;
257
num.real.data.fixnum = -1;
258
add_number_object(&num, number);
260
return (make_number_object(&num));
264
Lisp_Less(LispBuiltin *builtin)
266
< number &rest more-numbers
269
LispObj *compare, *number, *more_numbers;
271
more_numbers = ARGUMENT(1);
272
compare = ARGUMENT(0);
274
if (CONSP(more_numbers)) {
276
number = CAR(more_numbers);
277
if (cmp_object_object(compare, number, 1) >= 0)
280
more_numbers = CDR(more_numbers);
281
} while (CONSP(more_numbers));
291
Lisp_LessEqual(LispBuiltin *builtin)
293
<= number &rest more-numbers
296
LispObj *compare, *number, *more_numbers;
298
more_numbers = ARGUMENT(1);
299
compare = ARGUMENT(0);
301
if (CONSP(more_numbers)) {
303
number = CAR(more_numbers);
304
if (cmp_object_object(compare, number, 1) > 0)
307
more_numbers = CDR(more_numbers);
308
} while (CONSP(more_numbers));
318
Lisp_Equal_(LispBuiltin *builtin)
320
= number &rest more-numbers
323
LispObj *compare, *number, *more_numbers;
325
more_numbers = ARGUMENT(1);
326
compare = ARGUMENT(0);
328
if (CONSP(more_numbers)) {
330
number = CAR(more_numbers);
331
if (cmp_object_object(compare, number, 0) != 0)
334
more_numbers = CDR(more_numbers);
335
} while (CONSP(more_numbers));
345
Lisp_Greater(LispBuiltin *builtin)
347
> number &rest more-numbers
350
LispObj *compare, *number, *more_numbers;
352
more_numbers = ARGUMENT(1);
353
compare = ARGUMENT(0);
355
if (CONSP(more_numbers)) {
357
number = CAR(more_numbers);
358
if (cmp_object_object(compare, number, 1) <= 0)
361
more_numbers = CDR(more_numbers);
362
} while (CONSP(more_numbers));
372
Lisp_GreaterEqual(LispBuiltin *builtin)
374
>= number &rest more-numbers
377
LispObj *compare, *number, *more_numbers;
379
more_numbers = ARGUMENT(1);
380
compare = ARGUMENT(0);
382
if (CONSP(more_numbers)) {
384
number = CAR(more_numbers);
385
if (cmp_object_object(compare, number, 1) < 0)
388
more_numbers = CDR(more_numbers);
389
} while (CONSP(more_numbers));
399
Lisp_NotEqual(LispBuiltin *builtin)
401
/= number &rest more-numbers
404
LispObj *object, *compare, *number, *more_numbers;
406
more_numbers = ARGUMENT(1);
407
number = ARGUMENT(0);
409
if (!CONSP(more_numbers)) {
415
/* compare all numbers */
418
for (object = more_numbers; CONSP(object); object = CDR(object)) {
419
number = CAR(object);
421
if (cmp_object_object(compare, number, 0) == 0)
424
if (CONSP(more_numbers)) {
425
number = CAR(more_numbers);
426
more_numbers = CDR(more_numbers);
436
Lisp_Min(LispBuiltin *builtin)
438
min number &rest more-numbers
441
LispObj *result, *number, *more_numbers;
443
more_numbers = ARGUMENT(1);
444
result = ARGUMENT(0);
446
if (CONSP(more_numbers)) {
448
number = CAR(more_numbers);
449
if (cmp_object_object(result, number, 1) > 0)
451
more_numbers = CDR(more_numbers);
452
} while (CONSP(more_numbers));
462
Lisp_Max(LispBuiltin *builtin)
464
max number &rest more-numbers
467
LispObj *result, *number, *more_numbers;
469
more_numbers = ARGUMENT(1);
470
result = ARGUMENT(0);
472
if (CONSP(more_numbers)) {
474
number = CAR(more_numbers);
475
if (cmp_object_object(result, number, 1) < 0)
477
more_numbers = CDR(more_numbers);
478
} while (CONSP(more_numbers));
488
Lisp_Abs(LispBuiltin *builtin)
493
LispObj *result, *number;
495
result = number = ARGUMENT(0);
497
switch (OBJECT_TYPE(number)) {
504
if (cmp_real_object(&zero, number) > 0) {
507
set_real_object(&real, number);
509
result = make_real_object(&real);
512
case LispComplex_t: {
515
set_number_object(&num, number);
517
result = make_number_object(&num);
520
fatal_builtin_object_error(builtin, number, NOT_A_NUMBER);
528
Lisp_Complex(LispBuiltin *builtin)
530
complex realpart &optional imagpart
533
LispObj *realpart, *imagpart;
535
imagpart = ARGUMENT(1);
536
realpart = ARGUMENT(0);
538
CHECK_REAL(realpart);
540
if (imagpart == UNSPEC)
543
CHECK_REAL(imagpart);
545
if (!FLOATP(imagpart) && cmp_real_object(&zero, imagpart) == 0)
548
return (COMPLEX(realpart, imagpart));
552
Lisp_Complexp(LispBuiltin *builtin)
559
object = ARGUMENT(0);
561
return (COMPLEXP(object) ? T : NIL);
565
Lisp_Conjugate(LispBuiltin *builtin)
571
LispObj *number, *realpart, *imagpart;
573
number = ARGUMENT(0);
575
CHECK_NUMBER(number);
580
realpart = OCXR(number);
582
num.real.type = N_FIXNUM;
583
num.real.data.fixnum = -1;
584
mul_number_object(&num, OCXI(number));
585
imagpart = make_number_object(&num);
587
return (COMPLEX(realpart, imagpart));
591
Lisp_Decf(LispBuiltin *builtin)
593
decf place &optional delta
597
LispObj *place, *delta, *number;
602
if (SYMBOLP(place)) {
603
number = LispGetVar(place);
605
LispDestroy("EVAL: the variable %s is unbound", STROBJ(place));
608
number = EVAL(place);
610
if (delta != UNSPEC) {
613
operand = EVAL(delta);
614
set_number_object(&num, number);
615
sub_number_object(&num, operand);
616
number = make_number_object(&num);
620
num.real.type = N_FIXNUM;
621
num.real.data.fixnum = -1;
622
add_number_object(&num, number);
623
number = make_number_object(&num);
626
if (SYMBOLP(place)) {
627
CHECK_CONSTANT(place);
628
LispSetVar(place, number);
634
(void)APPLY2(Osetf, place, number);
642
Lisp_Denominator(LispBuiltin *builtin)
647
LispObj *result, *rational;
649
rational = ARGUMENT(0);
651
switch (OBJECT_TYPE(rational)) {
658
result = INTEGER(OFRD(rational));
661
if (mpi_fiti(OBRD(rational)))
662
result = INTEGER(mpi_geti(OBRD(rational)));
664
mpi *den = XALLOC(mpi);
667
mpi_set(den, OBRD(rational));
668
result = BIGNUM(den);
672
LispDestroy("%s: %s is not a rational number",
673
STRFUN(builtin), STROBJ(rational));
682
Lisp_Evenp(LispBuiltin *builtin)
687
LispObj *result, *integer;
689
integer = ARGUMENT(0);
691
switch (OBJECT_TYPE(integer)) {
693
result = FIXNUM_VALUE(integer) % 2 ? NIL : T;
696
result = INT_VALUE(integer) % 2 ? NIL : T;
699
result = mpi_remi(OBI(integer), 2) ? NIL : T;
702
fatal_builtin_object_error(builtin, integer, NOT_AN_INTEGER);
710
/* only one float format */
712
Lisp_Float(LispBuiltin *builtin)
714
float number &optional other
717
LispObj *number, *other;
720
number = ARGUMENT(0);
722
if (other != UNSPEC) {
726
return (LispFloatCoerce(builtin, number));
730
LispFloatCoerce(LispBuiltin *builtin, LispObj *number)
734
switch (OBJECT_TYPE(number)) {
736
value = FIXNUM_VALUE(number);
739
value = INT_VALUE(number);
742
value = mpi_getd(OBI(number));
747
value = (double)OFRN(number) / (double)OFRD(number);
750
value = mpr_getd(OBR(number));
754
fatal_builtin_object_error(builtin, number, NOT_A_REAL_NUMBER);
759
fatal_error(FLOATING_POINT_OVERFLOW);
761
return (DFLOAT(value));
765
Lisp_Floatp(LispBuiltin *builtin)
772
object = ARGUMENT(0);
774
return (FLOATP(object) ? T : NIL);
778
Lisp_Gcd(LispBuiltin *builtin)
784
LispObj *integers, *integer, *operand;
786
integers = ARGUMENT(0);
788
if (!CONSP(integers))
791
integer = CAR(integers);
793
CHECK_INTEGER(integer);
794
set_real_object(&real, integer);
795
integers = CDR(integers);
797
for (; CONSP(integers); integers = CDR(integers)) {
798
operand = CAR(integers);
799
gcd_real_object(&real, operand);
803
return (make_real_object(&real));
807
Lisp_Imagpart(LispBuiltin *builtin)
814
number = ARGUMENT(0);
816
if (COMPLEXP(number))
817
return (OCXI(number));
826
Lisp_Incf(LispBuiltin *builtin)
828
incf place &optional delta
832
LispObj *place, *delta, *number;
837
if (SYMBOLP(place)) {
838
number = LispGetVar(place);
840
LispDestroy("EVAL: the variable %s is unbound", STROBJ(place));
843
number = EVAL(place);
845
if (delta != UNSPEC) {
848
operand = EVAL(delta);
849
set_number_object(&num, number);
850
add_number_object(&num, operand);
851
number = make_number_object(&num);
855
num.real.type = N_FIXNUM;
856
num.real.data.fixnum = 1;
857
add_number_object(&num, number);
858
number = make_number_object(&num);
861
if (SYMBOLP(place)) {
862
CHECK_CONSTANT(place);
863
LispSetVar(place, number);
869
(void)APPLY2(Osetf, place, number);
877
Lisp_Integerp(LispBuiltin *builtin)
884
object = ARGUMENT(0);
886
return (INTEGERP(object) ? T : NIL);
890
Lisp_Isqrt(LispBuiltin *builtin)
895
LispObj *natural, *result;
897
natural = ARGUMENT(0);
899
if (cmp_object_object(natural, obj_zero, 1) < 0)
900
goto not_a_natural_number;
902
switch (OBJECT_TYPE(natural)) {
904
result = FIXNUM((long)floor(sqrt(FIXNUM_VALUE(natural))));
907
result = INTEGER((long)floor(sqrt(INT_VALUE(natural))));
914
mpi_sqrt(bigi, OBI(natural));
915
if (mpi_fiti(bigi)) {
916
result = INTEGER(mpi_geti(bigi));
921
result = BIGNUM(bigi);
924
goto not_a_natural_number;
929
not_a_natural_number:
930
LispDestroy("%s: %s is not a natural number",
931
STRFUN(builtin), STROBJ(natural));
937
Lisp_Lcm(LispBuiltin *builtin)
943
LispObj *integers, *operand;
945
integers = ARGUMENT(0);
947
if (!CONSP(integers))
950
operand = CAR(integers);
952
CHECK_INTEGER(operand);
953
set_real_object(&real, operand);
954
integers = CDR(integers);
959
for (; CONSP(integers); integers = CDR(integers)) {
960
operand = CAR(integers);
962
if (real.type == N_FIXNUM && real.data.fixnum == 0)
965
/* calculate gcd before changing integer */
967
set_real_real(&gcd, &real);
968
gcd_real_object(&gcd, operand);
971
mul_real_object(&real, operand);
972
div_real_real(&real, &gcd);
977
return (make_real_object(&real));
981
Lisp_Logand(LispBuiltin *builtin)
983
logand &rest integers
990
integers = ARGUMENT(0);
992
real.type = N_FIXNUM;
993
real.data.fixnum = -1;
995
for (; CONSP(integers); integers = CDR(integers))
996
and_real_object(&real, CAR(integers));
998
return (make_real_object(&real));
1002
Lisp_Logeqv(LispBuiltin *builtin)
1004
logeqv &rest integers
1011
integers = ARGUMENT(0);
1013
real.type = N_FIXNUM;
1014
real.data.fixnum = -1;
1016
for (; CONSP(integers); integers = CDR(integers))
1017
eqv_real_object(&real, CAR(integers));
1019
return (make_real_object(&real));
1023
Lisp_Logior(LispBuiltin *builtin)
1025
logior &rest integers
1032
integers = ARGUMENT(0);
1034
real.type = N_FIXNUM;
1035
real.data.fixnum = 0;
1037
for (; CONSP(integers); integers = CDR(integers))
1038
ior_real_object(&real, CAR(integers));
1040
return (make_real_object(&real));
1044
Lisp_Lognot(LispBuiltin *builtin)
1053
integer = ARGUMENT(0);
1055
CHECK_INTEGER(integer);
1057
set_real_object(&real, integer);
1060
return (make_real_object(&real));
1064
Lisp_Logxor(LispBuiltin *builtin)
1066
logxor &rest integers
1073
integers = ARGUMENT(0);
1075
real.type = N_FIXNUM;
1076
real.data.fixnum = 0;
1078
for (; CONSP(integers); integers = CDR(integers))
1079
xor_real_object(&real, CAR(integers));
1081
return (make_real_object(&real));
1085
Lisp_Minusp(LispBuiltin *builtin)
1092
number = ARGUMENT(0);
1096
return (cmp_real_object(&zero, number) > 0 ? T : NIL);
1100
Lisp_Mod(LispBuiltin *builtin)
1107
LispObj *number, *divisor;
1109
divisor = ARGUMENT(1);
1110
number = ARGUMENT(0);
1112
if (INTEGERP(number) && INTEGERP(divisor)) {
1115
set_real_object(&real, number);
1116
mod_real_object(&real, divisor);
1117
result = make_real_object(&real);
1122
set_number_object(&num, number);
1123
divide_number_object(&num, divisor, NDIVIDE_FLOOR, 0);
1124
result = make_real_object(&(num.imag));
1125
clear_real(&(num.real));
1132
Lisp_Numberp(LispBuiltin *builtin)
1139
object = ARGUMENT(0);
1141
return (NUMBERP(object) ? T : NIL);
1145
Lisp_Numerator(LispBuiltin *builtin)
1150
LispObj *result, *rational;
1152
rational = ARGUMENT(0);
1154
switch (OBJECT_TYPE(rational)) {
1161
result = INTEGER(OFRN(rational));
1163
case LispBigratio_t:
1164
if (mpi_fiti(OBRN(rational)))
1165
result = INTEGER(mpi_geti(OBRN(rational)));
1167
mpi *num = XALLOC(mpi);
1170
mpi_set(num, OBRN(rational));
1171
result = BIGNUM(num);
1175
LispDestroy("%s: %s is not a rational number",
1176
STRFUN(builtin), STROBJ(rational));
1185
Lisp_Oddp(LispBuiltin *builtin)
1190
LispObj *result, *integer;
1192
integer = ARGUMENT(0);
1194
switch (OBJECT_TYPE(integer)) {
1196
result = FIXNUM_VALUE(integer) % 2 ? T : NIL;
1199
result = INT_VALUE(integer) % 2 ? T : NIL;
1202
result = mpi_remi(OBI(integer), 2) ? T : NIL;
1205
fatal_builtin_object_error(builtin, integer, NOT_AN_INTEGER);
1214
Lisp_Plusp(LispBuiltin *builtin)
1221
number = ARGUMENT(0);
1225
return (cmp_real_object(&zero, number) < 0 ? T : NIL);
1229
Lisp_Rational(LispBuiltin *builtin)
1236
number = ARGUMENT(0);
1238
if (DFLOATP(number)) {
1239
double numerator = ODF(number);
1241
if ((long)numerator == numerator)
1242
number = INTEGER(numerator);
1245
mpr *bigr = XALLOC(mpr);
1248
mpr_setd(bigr, numerator);
1249
real.type = N_BIGRATIO;
1250
real.data.bigratio = bigr;
1251
rbr_canonicalize(&real);
1252
number = make_real_object(&real);
1263
Lisp_Rationalp(LispBuiltin *builtin)
1270
object = ARGUMENT(0);
1272
return (RATIONALP(object) ? T : NIL);
1276
Lisp_Realpart(LispBuiltin *builtin)
1283
number = ARGUMENT(0);
1285
if (COMPLEXP(number))
1286
return (OCXR(number));
1295
Lisp_Rem(LispBuiltin *builtin)
1302
LispObj *number, *divisor;
1304
divisor = ARGUMENT(1);
1305
number = ARGUMENT(0);
1307
if (INTEGERP(number) && INTEGERP(divisor)) {
1310
set_real_object(&real, number);
1311
rem_real_object(&real, divisor);
1312
result = make_real_object(&real);
1317
set_number_object(&num, number);
1318
divide_number_object(&num, divisor, NDIVIDE_TRUNC, 0);
1319
result = make_real_object(&(num.imag));
1320
clear_real(&(num.real));
1327
Lisp_Sqrt(LispBuiltin *builtin)
1335
number = ARGUMENT(0);
1337
set_number_object(&num, number);
1340
return (make_number_object(&num));
1344
Lisp_Zerop(LispBuiltin *builtin)
1349
LispObj *result, *number;
1351
number = ARGUMENT(0);
1353
switch (OBJECT_TYPE(number)) {
1359
case LispBigratio_t:
1360
result = cmp_real_object(&zero, number) == 0 ? T : NIL;
1363
result = cmp_real_object(&zero, OCXR(number)) == 0 &&
1364
cmp_real_object(&zero, OCXI(number)) == 0 ? T : NIL;
1367
fatal_builtin_object_error(builtin, number, NOT_A_NUMBER);
1376
LispDivide(LispBuiltin *builtin, int fun, int flo)
1379
LispObj *number, *divisor;
1381
divisor = ARGUMENT(1);
1382
number = ARGUMENT(0);
1386
if (cmp_real_object(&zero, number) == 0) {
1387
if (divisor != NIL) {
1388
CHECK_REAL(divisor);
1391
return (RETURN(0) = obj_zero);
1394
if (divisor == UNSPEC)
1397
set_number_object(&num, number);
1399
fatal_builtin_object_error(builtin, divisor, NOT_A_REAL_NUMBER);
1401
divide_number_object(&num, divisor, fun, flo);
1402
RETURN(0) = make_real_object(&(num.imag));
1404
return (make_real_object(&(num.real)));
1408
Lisp_Ceiling(LispBuiltin *builtin)
1410
ceiling number &optional divisor
1413
return (LispDivide(builtin, NDIVIDE_CEIL, 0));
1417
Lisp_Fceiling(LispBuiltin *builtin)
1419
fceiling number &optional divisor
1422
return (LispDivide(builtin, NDIVIDE_CEIL, 1));
1426
Lisp_Floor(LispBuiltin *builtin)
1428
floor number &optional divisor
1431
return (LispDivide(builtin, NDIVIDE_FLOOR, 0));
1435
Lisp_Ffloor(LispBuiltin *builtin)
1437
ffloor number &optional divisor
1440
return (LispDivide(builtin, NDIVIDE_FLOOR, 1));
1444
Lisp_Round(LispBuiltin *builtin)
1446
round number &optional divisor
1449
return (LispDivide(builtin, NDIVIDE_ROUND, 0));
1453
Lisp_Fround(LispBuiltin *builtin)
1455
fround number &optional divisor
1458
return (LispDivide(builtin, NDIVIDE_ROUND, 1));
1462
Lisp_Truncate(LispBuiltin *builtin)
1464
truncate number &optional divisor
1467
return (LispDivide(builtin, NDIVIDE_TRUNC, 0));
1471
Lisp_Ftruncate(LispBuiltin *builtin)
1473
ftruncate number &optional divisor
1476
return (LispDivide(builtin, NDIVIDE_TRUNC, 1));