Changeset 295
- Timestamp:
- Jan 14, 2004, 7:59:52 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/ccl/level-0/l0-numbers.lisp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/level-0/l0-numbers.lisp
r287 r295 967 967 (return-from truncate (truncate-no-rem number divisor))) 968 968 (macrolet 969 ((truncate-rat-dfloat (number divisor) 970 `(with-stack-double-floats ((fnum ,number) 971 (f2)) 972 (let ((res (%unary-truncate (%double-float/-2! fnum ,divisor f2)))) 973 (values res 974 (%double-float--2 fnum (%double-float*-2! (%double-float res f2) ,divisor f2)))))) 975 (truncate-rat-sfloat (number divisor) 976 `(with-stack-short-floats ((fnum ,number) 977 (f2)) 978 (let ((res (%unary-truncate (%short-float/-2! fnum ,divisor f2)))) 979 (values res 980 (%short-float--2 fnum (%short-float*-2! (%short-float res f2) ,divisor f2))))))) 981 (number-case number 982 (fixnum (number-case divisor 983 (fixnum (if (eq divisor 1) (values number 0) (%fixnum-truncate number divisor))) 984 (bignum (values 0 number)) 985 (double-float (truncate-rat-dfloat number divisor)) 986 (short-float (truncate-rat-sfloat number divisor)) 987 (ratio (let ((q (truncate (* number (%denominator divisor)) ; this was wrong 988 (%numerator divisor)))) 989 (values q (- number (* q divisor))))))) 990 (bignum (number-case divisor 991 (fixnum (if (eq divisor 1) (values number 0) 992 (if (eq divisor most-negative-fixnum) ;; << aargh 993 (with-small-bignum-buffers ((bd divisor)) 994 (bignum-truncate number bd)) 995 (bignum-truncate-by-fixnum number divisor)))) 996 (bignum (bignum-truncate number divisor)) 997 (double-float (truncate-rat-dfloat number divisor)) 998 (short-float (truncate-rat-sfloat number divisor)) 999 (ratio (let ((q (truncate (* number (%denominator divisor)) ; so was this 1000 (%numerator divisor)))) 1001 (values q (- number (* q divisor))))))) 1002 (short-float (if (eql divisor 1) 1003 (let* ((res (%unary-truncate number))) 1004 (values res (- number res))) 1005 (number-case divisor 1006 (short-float 1007 (with-stack-short-floats ((f2)) 1008 (let ((res (%unary-truncate (%short-float/-2! number divisor f2)))) 1009 (values res 1010 (%short-float--2 1011 number 1012 (%short-float*-2! (%short-float res f2) divisor f2)))))) 1013 ((fixnum bignum ratio) 1014 (with-stack-short-floats ((fdiv divisor) 1015 (f2)) 1016 (let ((res (%unary-truncate (%short-float/-2! number fdiv f2)))) 1017 (values res 1018 (%short-float--2 1019 number 1020 (%short-float*-2! (%short-float res f2) fdiv f2)))))) 1021 (double-float 1022 (with-stack-double-floats ((fnum number) 969 ((truncate-rat-dfloat (number divisor) 970 `(with-stack-double-floats ((fnum ,number) 971 (f2)) 972 (let ((res (%unary-truncate (%double-float/-2! fnum ,divisor f2)))) 973 (values res 974 (%double-float--2 fnum (%double-float*-2! (%double-float res f2) ,divisor f2)))))) 975 (truncate-rat-sfloat (number divisor) 976 `(with-stack-short-floats ((fnum ,number) 977 (f2)) 978 (let ((res (%unary-truncate (%short-float/-2! fnum ,divisor f2)))) 979 (values res 980 (%short-float--2 fnum (%short-float*-2! (%short-float res f2) ,divisor f2))))))) 981 (number-case number 982 (fixnum 983 (if (eql number most-negative-fixnum) 984 (if (zerop divisor) 985 (error 'division-by-zero :operation 'truncate :operands (list number divisor)) 986 (with-small-bignum-buffers ((bn number)) 987 (multiple-value-bind (quo rem) (truncate bn divisor) 988 (if (eq quo bn) 989 (values number rem) 990 (values quo rem))))) 991 (number-case divisor 992 (fixnum (if (eq divisor 1) (values number 0) (%fixnum-truncate number divisor))) 993 (bignum (values 0 number)) 994 (double-float (truncate-rat-dfloat number divisor)) 995 (short-float (truncate-rat-sfloat number divisor)) 996 (ratio (let ((q (truncate (* number (%denominator divisor)) ; this was wrong 997 (%numerator divisor)))) 998 (values q (- number (* q divisor)))))))) 999 (bignum (number-case divisor 1000 (fixnum (if (eq divisor 1) (values number 0) 1001 (if (eq divisor most-negative-fixnum);; << aargh 1002 (with-small-bignum-buffers ((bd divisor)) 1003 (bignum-truncate number bd)) 1004 (bignum-truncate-by-fixnum number divisor)))) 1005 (bignum (bignum-truncate number divisor)) 1006 (double-float (truncate-rat-dfloat number divisor)) 1007 (short-float (truncate-rat-sfloat number divisor)) 1008 (ratio (let ((q (truncate (* number (%denominator divisor)) ; so was this 1009 (%numerator divisor)))) 1010 (values q (- number (* q divisor))))))) 1011 (short-float (if (eql divisor 1) 1012 (let* ((res (%unary-truncate number))) 1013 (values res (- number res))) 1014 (number-case divisor 1015 (short-float 1016 (with-stack-short-floats ((f2)) 1017 (let ((res (%unary-truncate (%short-float/-2! number divisor f2)))) 1018 (values res 1019 (%short-float--2 1020 number 1021 (%short-float*-2! (%short-float res f2) divisor f2)))))) 1022 ((fixnum bignum ratio) 1023 (with-stack-short-floats ((fdiv divisor) 1024 (f2)) 1025 (let ((res (%unary-truncate (%short-float/-2! number fdiv f2)))) 1026 (values res 1027 (%short-float--2 1028 number 1029 (%short-float*-2! (%short-float res f2) fdiv f2)))))) 1030 (double-float 1031 (with-stack-double-floats ((fnum number) 1032 (f2)) 1033 (let* ((res (%unary-truncate (%double-float/-2! fnum divisor f2)))) 1034 (values res 1035 (%double-float--2 1036 fnum 1037 (%double-float*-2! (%double-float res f2) divisor f2))))))))) 1038 (double-float (if (eql divisor 1) 1039 (let ((res (%unary-truncate number))) 1040 (values res (- number res))) 1041 (number-case divisor 1042 ((fixnum bignum ratio short-float) 1043 (with-stack-double-floats ((fdiv divisor) 1023 1044 (f2)) 1024 (let* ((res (%unary-truncate (%double-float/-2! fnum divisor f2)))) 1025 (values res 1026 (%double-float--2 1027 fnum 1028 (%double-float*-2! (%double-float res f2) divisor f2))))))))) 1029 (double-float (if (eql divisor 1) 1030 (let ((res (%unary-truncate number))) 1031 (values res (- number res))) 1032 (number-case divisor 1033 ((fixnum bignum ratio short-float) 1034 (with-stack-double-floats ((fdiv divisor) 1035 (f2)) 1036 (let ((res (%unary-truncate (%double-float/-2! number fdiv f2)))) 1037 (values res 1038 (%double-float--2 1039 number 1040 (%double-float*-2! (%double-float res f2) fdiv f2)))))) 1041 (double-float 1042 (with-stack-double-floats ((f2)) 1043 (let ((res (%unary-truncate (%double-float/-2! number divisor f2)))) 1044 (values res 1045 (%double-float--2 1046 number 1047 (%double-float*-2! (%double-float res f2) divisor f2))))))))) 1048 (ratio (number-case divisor 1049 (double-float (truncate-rat-dfloat number divisor)) 1050 (short-float (truncate-rat-sfloat number divisor)) 1051 (rational 1052 (let ((q (truncate (%numerator number) 1053 (* (%denominator number) divisor)))) 1054 (values q (- number (* q divisor)))))))))) 1045 (let ((res (%unary-truncate (%double-float/-2! number fdiv f2)))) 1046 (values res 1047 (%double-float--2 1048 number 1049 (%double-float*-2! (%double-float res f2) fdiv f2)))))) 1050 (double-float 1051 (with-stack-double-floats ((f2)) 1052 (let ((res (%unary-truncate (%double-float/-2! number divisor f2)))) 1053 (values res 1054 (%double-float--2 1055 number 1056 (%double-float*-2! (%double-float res f2) divisor f2))))))))) 1057 (ratio (number-case divisor 1058 (double-float (truncate-rat-dfloat number divisor)) 1059 (short-float (truncate-rat-sfloat number divisor)) 1060 (rational 1061 (let ((q (truncate (%numerator number) 1062 (* (%denominator number) divisor)))) 1063 (values q (- number (* q divisor)))))))))) 1055 1064 1056 1065 (defun truncate-no-rem (number divisor) … … 1065 1074 (f2)) 1066 1075 (%unary-truncate (%short-float/-2! fnum ,divisor f2))))) 1067 (number-case number 1068 (fixnum (number-case divisor 1069 (fixnum (if (eq divisor 1) number (values (%fixnum-truncate number divisor)))) 1070 (bignum 0) 1071 (double-float (truncate-rat-dfloat number divisor)) 1072 (short-float (truncate-rat-sfloat number divisor)) 1073 (ratio (let ((q (truncate (* number (%denominator divisor)) 1074 (%numerator divisor)))) 1075 q)))) 1076 (bignum (number-case divisor 1077 (fixnum (if (eq divisor 1) number 1078 (if (eq divisor most-negative-fixnum) 1079 (with-small-bignum-buffers ((bd divisor)) 1080 (bignum-truncate number bd :no-rem)) 1081 (bignum-truncate-by-fixnum number divisor)))) 1082 (bignum (bignum-truncate number divisor :no-rem)) 1083 (double-float (truncate-rat-dfloat number divisor)) 1084 (short-float (truncate-rat-sfloat number divisor)) 1085 (ratio (let ((q (truncate (* number (%denominator divisor)) 1086 (%numerator divisor)))) 1087 Q)))) 1088 (double-float (if (eql divisor 1) 1089 (let ((res (%unary-truncate number))) 1090 RES) 1091 (number-case divisor 1092 ((fixnum bignum ratio) 1093 (with-stack-double-floats ((fdiv divisor) 1094 (f2)) 1095 (let ((res (%unary-truncate (%double-float/-2! number fdiv f2)))) 1096 RES))) 1097 (short-float 1098 (with-stack-double-floats ((ddiv divisor) 1099 (f2)) 1100 (%unary-truncate (%double-float/-2! number ddiv f2)))) 1101 (double-float 1102 (with-stack-double-floats ((f2)) 1103 (%unary-truncate (%double-float/-2! number divisor f2))))))) 1104 (short-float (if (eql divisor 1) 1076 (number-case number 1077 (fixnum 1078 (if (eql number most-negative-fixnum) 1079 (if (zerop divisor) 1080 (error 'division-by-zero :operation 'truncate :operands (list number divisor)) 1081 (with-small-bignum-buffers ((bn number)) 1082 (let* ((result (truncate-no-rem bn divisor))) 1083 (if (eq result bn) 1084 number 1085 result)))) 1086 (number-case divisor 1087 (fixnum (if (eq divisor 1) number (values (%fixnum-truncate number divisor)))) 1088 (bignum 0) 1089 (double-float (truncate-rat-dfloat number divisor)) 1090 (short-float (truncate-rat-sfloat number divisor)) 1091 (ratio (let ((q (truncate (* number (%denominator divisor)) 1092 (%numerator divisor)))) 1093 q))))) 1094 (bignum (number-case divisor 1095 (fixnum (if (eq divisor 1) number 1096 (if (eq divisor most-negative-fixnum) 1097 (with-small-bignum-buffers ((bd divisor)) 1098 (bignum-truncate number bd :no-rem)) 1099 (bignum-truncate-by-fixnum number divisor)))) 1100 (bignum (bignum-truncate number divisor :no-rem)) 1101 (double-float (truncate-rat-dfloat number divisor)) 1102 (short-float (truncate-rat-sfloat number divisor)) 1103 (ratio (let ((q (truncate (* number (%denominator divisor)) 1104 (%numerator divisor)))) 1105 Q)))) 1106 (double-float (if (eql divisor 1) 1107 (let ((res (%unary-truncate number))) 1108 RES) 1109 (number-case divisor 1110 ((fixnum bignum ratio) 1111 (with-stack-double-floats ((fdiv divisor) 1112 (f2)) 1113 (let ((res (%unary-truncate (%double-float/-2! number fdiv f2)))) 1114 RES))) 1115 (short-float 1116 (with-stack-double-floats ((ddiv divisor) 1117 (f2)) 1118 (%unary-truncate (%double-float/-2! number ddiv f2)))) 1119 (double-float 1120 (with-stack-double-floats ((f2)) 1121 (%unary-truncate (%double-float/-2! number divisor f2))))))) 1122 (short-float (if (eql divisor 1) 1105 1123 (let ((res (%unary-truncate number))) 1106 1124 RES) … … 1108 1126 ((fixnum bignum ratio) 1109 1127 (with-stack-short-floats ((fdiv divisor) 1110 (f2))1128 (f2)) 1111 1129 (let ((res (%unary-truncate (%short-float/-2! number fdiv f2)))) 1112 1130 RES)))
Note:
See TracChangeset
for help on using the changeset viewer.
