blob: f61eaeba58e6905c606e8493f7094144d0223310 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Float object implementation */
33
Guido van Rossum2a9096b1990-10-21 22:15:08 +000034/* XXX There should be overflow checks here, but it's hard to check
35 for any kind of float exception without losing portability. */
36
Guido van Rossum3f5da241990-12-20 15:06:42 +000037#include "allobjects.h"
Guido van Rossume5372401993-03-16 12:15:04 +000038#include "modsupport.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039
Guido van Rossumc211ee41990-12-20 23:06:26 +000040#include <errno.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000041#include <ctype.h>
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000042#include "mymath.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043
Guido van Rossum9575a441993-04-07 14:06:14 +000044#ifdef i860
45/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
46#undef HUGE_VAL
47#endif
48
Guido van Rossum9d81b551996-06-26 18:27:19 +000049#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000050#define CHECK(x) if (errno != 0) ; \
51 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
52 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000053#endif
54
55#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000056#define CHECK(x) /* Don't know how to check */
57#endif
58
Guido van Rossum03093a21994-09-28 15:51:32 +000059#ifdef HAVE_LIMITS_H
60#include <limits.h>
61#endif
62
63#ifndef LONG_MAX
64#define LONG_MAX 0X7FFFFFFFL
65#endif
66
67#ifndef LONG_MIN
68#define LONG_MIN (-LONG_MAX-1)
69#endif
70
Guido van Rossum67ca7011995-02-13 16:38:41 +000071#ifdef __NeXT__
72#ifdef __sparc__
73/*
74 * This works around a bug in the NS/Sparc 3.3 pre-release
75 * limits.h header file.
76 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
77 */
78#undef LONG_MIN
79#define LONG_MIN (-LONG_MAX-1)
80#endif
81#endif
82
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000083#if !defined(__STDC__) && !defined(macintosh)
Guido van Rossum6923e131990-11-02 17:50:43 +000084extern double fmod PROTO((double, double));
85extern double pow PROTO((double, double));
86#endif
87
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088object *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000089#ifdef __SC__
90newfloatobject(double fval)
91#else
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092newfloatobject(fval)
93 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000094#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095{
96 /* For efficiency, this code is copied from newobject() */
97 register floatobject *op = (floatobject *) malloc(sizeof(floatobject));
Guido van Rossum2a9096b1990-10-21 22:15:08 +000098 if (op == NULL)
99 return err_nomem();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000100 op->ob_type = &Floattype;
101 op->ob_fval = fval;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000102 NEWREF(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 return (object *) op;
104}
105
Guido van Rossum234f9421993-06-17 12:35:49 +0000106static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000107float_dealloc(op)
108 object *op;
109{
110 DEL(op);
111}
112
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113double
114getfloatvalue(op)
115 object *op;
116{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000117 number_methods *nb;
118 floatobject *fo;
119 double val;
120
121 if (op && is_floatobject(op))
122 return GETFLOATVALUE((floatobject*) op);
123
124 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
125 nb->nb_float == NULL) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000126 err_badarg();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127 return -1;
128 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000129
130 fo = (floatobject*) (*nb->nb_float) (op);
131 if (fo == NULL)
132 return -1;
133 if (!is_floatobject(fo)) {
134 err_setstr(TypeError, "nb_float should return float object");
135 return -1;
136 }
137
138 val = GETFLOATVALUE(fo);
139 DECREF(fo);
140
141 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142}
143
144/* Methods */
145
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000146void
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147float_buf_repr(buf, v)
148 char *buf;
149 floatobject *v;
150{
151 register char *cp;
152 /* Subroutine for float_repr and float_print.
153 We want float numbers to be recognizable as such,
154 i.e., they should contain a decimal point or an exponent.
155 However, %g may print the number as an integer;
156 in such cases, we append ".0" to the string. */
157 sprintf(buf, "%.12g", v->ob_fval);
158 cp = buf;
159 if (*cp == '-')
160 cp++;
161 for (; *cp != '\0'; cp++) {
162 /* Any non-digit means it's not an integer;
163 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000164 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165 break;
166 }
167 if (*cp == '\0') {
168 *cp++ = '.';
169 *cp++ = '0';
170 *cp++ = '\0';
171 }
172}
173
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000174/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000175static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000176float_print(v, fp, flags)
177 floatobject *v;
178 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000179 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180{
181 char buf[100];
182 float_buf_repr(buf, v);
183 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000184 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185}
186
187static object *
188float_repr(v)
189 floatobject *v;
190{
191 char buf[100];
192 float_buf_repr(buf, v);
193 return newstringobject(buf);
194}
195
196static int
197float_compare(v, w)
198 floatobject *v, *w;
199{
200 double i = v->ob_fval;
201 double j = w->ob_fval;
202 return (i < j) ? -1 : (i > j) ? 1 : 0;
203}
204
Guido van Rossum9bfef441993-03-29 10:43:31 +0000205static long
206float_hash(v)
207 floatobject *v;
208{
209 double intpart, fractpart;
210 int expo;
211 long x;
212 /* This is designed so that Python numbers with the same
213 value hash to the same value, otherwise comparisons
214 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000215
216#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
217{
218 extended e;
219 fractpart = modf(v->ob_fval, &e);
220 intpart = e;
221}
222#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000223 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000224#endif
225
Guido van Rossum9bfef441993-03-29 10:43:31 +0000226 if (fractpart == 0.0) {
227 if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
228 /* Convert to long int and use its hash... */
229 object *w = dnewlongobject(v->ob_fval);
230 if (w == NULL)
231 return -1;
232 x = hashobject(w);
233 DECREF(w);
234 return x;
235 }
236 x = (long)intpart;
237 }
238 else {
239 fractpart = frexp(fractpart, &expo);
Guido van Rossum6610ad91995-01-04 19:07:38 +0000240 fractpart = fractpart*2147483648.0; /* 2**31 */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000241 x = (long) (intpart + fractpart) ^ expo; /* Rather arbitrary */
242 }
243 if (x == -1)
244 x = -2;
245 return x;
246}
247
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248static object *
249float_add(v, w)
250 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000251 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000253 return newfloatobject(v->ob_fval + w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254}
255
256static object *
257float_sub(v, w)
258 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000259 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000261 return newfloatobject(v->ob_fval - w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262}
263
264static object *
265float_mul(v, w)
266 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000267 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000269 return newfloatobject(v->ob_fval * w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270}
271
272static object *
273float_div(v, w)
274 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000275 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000277 if (w->ob_fval == 0) {
Guido van Rossum9a9fadd1991-12-10 13:56:55 +0000278 err_setstr(ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 return NULL;
280 }
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000281 return newfloatobject(v->ob_fval / w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282}
283
284static object *
285float_rem(v, w)
286 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000287 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000289 double vx, wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000290 double /* div, */ mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000291 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292 if (wx == 0.0) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000293 err_setstr(ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 return NULL;
295 }
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000296 vx = v->ob_fval;
297 mod = fmod(vx, wx);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000298 /* div = (vx - mod) / wx; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000299 if (wx*mod < 0) {
300 mod += wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000301 /* div -= 1.0; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000302 }
303 return newfloatobject(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304}
305
306static object *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000307float_divmod(v, w)
308 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000309 floatobject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000310{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000311 double vx, wx;
312 double div, mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000313 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000314 if (wx == 0.0) {
Guido van Rossum9a9fadd1991-12-10 13:56:55 +0000315 err_setstr(ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000316 return NULL;
317 }
318 vx = v->ob_fval;
319 mod = fmod(vx, wx);
320 div = (vx - mod) / wx;
321 if (wx*mod < 0) {
322 mod += wx;
323 div -= 1.0;
324 }
Guido van Rossume5372401993-03-16 12:15:04 +0000325 return mkvalue("(dd)", div, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000326}
327
Guido van Rossum363078a1996-05-24 20:45:01 +0000328static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000329 double x;
330 long n;
331{
332 double r = 1.;
333 double p = x;
334 long mask = 1;
335 while (mask > 0 && n >= mask) {
336 if (n & mask)
337 r *= p;
338 mask <<= 1;
339 p *= p;
340 }
341 return r;
342}
343
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000344static object *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000345float_pow(v, w, z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346 floatobject *v;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000347 object *w;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000348 floatobject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349{
350 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000351 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000352 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
353 * The z parameter is really only going to be useful for integers and
354 * long integers. Maybe something clever with logarithms could be done.
355 * [AMK]
356 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000357 iv = v->ob_fval;
358 iw = ((floatobject *)w)->ob_fval;
359 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000360 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000361 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000362 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000363 if ((object *)z!=None) {
364 ix=fmod(1.0, z->ob_fval);
365 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
366 }
367 else ix=1.0;
368 return newfloatobject(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000369 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000370 errno = 0;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000371 if (intw > 0)
372 ix = powu(iv, intw);
373 else
374 ix = 1./powu(iv, -intw);
Guido van Rossum86c04c21996-08-09 20:50:14 +0000375 }
376 else {
377 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000378 if (iv == 0.0) {
379 if (iw < 0.0) {
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000380 err_setstr(ValueError,
381 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000382 return NULL;
383 }
384 return newfloatobject(0.0);
385 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000386 if (iv < 0.0) {
387 err_setstr(ValueError,
388 "negative number to a float power");
389 return NULL;
390 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000391 errno = 0;
392 ix = pow(iv, iw);
Guido van Rossum70d93461991-05-28 21:57:39 +0000393 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000394 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000395 if (errno != 0) {
396 /* XXX could it be another type of error? */
397 err_errno(OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000399 }
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000400 if ((object *)z!=None) {
401 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
402 if ( ix!=0 &&
403 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
404 ix+=z->ob_fval;
405 }
406 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000407 return newfloatobject(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408}
409
410static object *
411float_neg(v)
412 floatobject *v;
413{
414 return newfloatobject(-v->ob_fval);
415}
416
417static object *
418float_pos(v)
419 floatobject *v;
420{
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000421 INCREF(v);
422 return (object *)v;
423}
424
425static object *
426float_abs(v)
427 floatobject *v;
428{
429 if (v->ob_fval < 0)
430 return float_neg(v);
431 else
432 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433}
434
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000435static int
436float_nonzero(v)
437 floatobject *v;
438{
439 return v->ob_fval != 0.0;
440}
441
Guido van Rossum234f9421993-06-17 12:35:49 +0000442static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000443float_coerce(pv, pw)
444 object **pv;
445 object **pw;
446{
447 if (is_intobject(*pw)) {
448 long x = getintvalue(*pw);
449 *pw = newfloatobject((double)x);
450 INCREF(*pv);
451 return 0;
452 }
453 else if (is_longobject(*pw)) {
454 *pw = newfloatobject(dgetlongvalue(*pw));
455 INCREF(*pv);
456 return 0;
457 }
458 return 1; /* Can't do it */
459}
460
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000461static object *
462float_int(v)
463 object *v;
464{
465 double x = getfloatvalue(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000466 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
467 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossum67ca7011995-02-13 16:38:41 +0000468 err_setstr(OverflowError, "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000469 return NULL;
470 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000471 return newintobject((long)x);
472}
473
474static object *
475float_long(v)
476 object *v;
477{
478 double x = getfloatvalue(v);
479 return dnewlongobject(x);
480}
481
482static object *
483float_float(v)
484 object *v;
485{
486 INCREF(v);
487 return v;
488}
489
490
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491static number_methods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000492 (binaryfunc)float_add, /*nb_add*/
493 (binaryfunc)float_sub, /*nb_subtract*/
494 (binaryfunc)float_mul, /*nb_multiply*/
495 (binaryfunc)float_div, /*nb_divide*/
496 (binaryfunc)float_rem, /*nb_remainder*/
497 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000498 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000499 (unaryfunc)float_neg, /*nb_negative*/
500 (unaryfunc)float_pos, /*nb_positive*/
501 (unaryfunc)float_abs, /*nb_absolute*/
502 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000503 0, /*nb_invert*/
504 0, /*nb_lshift*/
505 0, /*nb_rshift*/
506 0, /*nb_and*/
507 0, /*nb_xor*/
508 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000509 (coercion)float_coerce, /*nb_coerce*/
510 (unaryfunc)float_int, /*nb_int*/
511 (unaryfunc)float_long, /*nb_long*/
512 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000513 0, /*nb_oct*/
514 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000515};
516
517typeobject Floattype = {
518 OB_HEAD_INIT(&Typetype)
519 0,
520 "float",
521 sizeof(floatobject),
522 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000523 (destructor)float_dealloc, /*tp_dealloc*/
524 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000525 0, /*tp_getattr*/
526 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000527 (cmpfunc)float_compare, /*tp_compare*/
528 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000529 &float_as_number, /*tp_as_number*/
530 0, /*tp_as_sequence*/
531 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000532 (hashfunc)float_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000533};