blob: b68807f5ad9efd1e449ce599eeab3676a3a7ea8a [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Float object implementation */
26
Guido van Rossum2a9096b1990-10-21 22:15:08 +000027/* XXX There should be overflow checks here, but it's hard to check
28 for any kind of float exception without losing portability. */
29
Guido van Rossum3f5da241990-12-20 15:06:42 +000030#include "allobjects.h"
Guido van Rossume5372401993-03-16 12:15:04 +000031#include "modsupport.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032
Guido van Rossumc211ee41990-12-20 23:06:26 +000033#include <errno.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000034#include <ctype.h>
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000035#include "mymath.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036
Guido van Rossum9575a441993-04-07 14:06:14 +000037#ifdef i860
38/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
39#undef HUGE_VAL
40#endif
41
Guido van Rossum9d81b551996-06-26 18:27:19 +000042#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000043#define CHECK(x) if (errno != 0) ; \
44 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
45 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000046#endif
47
48#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000049#define CHECK(x) /* Don't know how to check */
50#endif
51
Guido van Rossum03093a21994-09-28 15:51:32 +000052#ifdef HAVE_LIMITS_H
53#include <limits.h>
54#endif
55
56#ifndef LONG_MAX
57#define LONG_MAX 0X7FFFFFFFL
58#endif
59
60#ifndef LONG_MIN
61#define LONG_MIN (-LONG_MAX-1)
62#endif
63
Guido van Rossum67ca7011995-02-13 16:38:41 +000064#ifdef __NeXT__
65#ifdef __sparc__
66/*
67 * This works around a bug in the NS/Sparc 3.3 pre-release
68 * limits.h header file.
69 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
70 */
71#undef LONG_MIN
72#define LONG_MIN (-LONG_MAX-1)
73#endif
74#endif
75
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000076#if !defined(__STDC__) && !defined(macintosh)
Guido van Rossum6923e131990-11-02 17:50:43 +000077extern double fmod PROTO((double, double));
78extern double pow PROTO((double, double));
79#endif
80
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081object *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000082#ifdef __SC__
83newfloatobject(double fval)
84#else
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085newfloatobject(fval)
86 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000087#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088{
89 /* For efficiency, this code is copied from newobject() */
90 register floatobject *op = (floatobject *) malloc(sizeof(floatobject));
Guido van Rossum2a9096b1990-10-21 22:15:08 +000091 if (op == NULL)
92 return err_nomem();
Guido van Rossum2a9096b1990-10-21 22:15:08 +000093 op->ob_type = &Floattype;
94 op->ob_fval = fval;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000095 NEWREF(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096 return (object *) op;
97}
98
Guido van Rossum234f9421993-06-17 12:35:49 +000099static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000100float_dealloc(op)
101 object *op;
102{
103 DEL(op);
104}
105
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106double
107getfloatvalue(op)
108 object *op;
109{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000110 number_methods *nb;
111 floatobject *fo;
112 double val;
113
114 if (op && is_floatobject(op))
115 return GETFLOATVALUE((floatobject*) op);
116
117 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
118 nb->nb_float == NULL) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000119 err_badarg();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 return -1;
121 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000122
123 fo = (floatobject*) (*nb->nb_float) (op);
124 if (fo == NULL)
125 return -1;
126 if (!is_floatobject(fo)) {
127 err_setstr(TypeError, "nb_float should return float object");
128 return -1;
129 }
130
131 val = GETFLOATVALUE(fo);
132 DECREF(fo);
133
134 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135}
136
137/* Methods */
138
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000139void
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140float_buf_repr(buf, v)
141 char *buf;
142 floatobject *v;
143{
144 register char *cp;
145 /* Subroutine for float_repr and float_print.
146 We want float numbers to be recognizable as such,
147 i.e., they should contain a decimal point or an exponent.
148 However, %g may print the number as an integer;
149 in such cases, we append ".0" to the string. */
150 sprintf(buf, "%.12g", v->ob_fval);
151 cp = buf;
152 if (*cp == '-')
153 cp++;
154 for (; *cp != '\0'; cp++) {
155 /* Any non-digit means it's not an integer;
156 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000157 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158 break;
159 }
160 if (*cp == '\0') {
161 *cp++ = '.';
162 *cp++ = '0';
163 *cp++ = '\0';
164 }
165}
166
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000167/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000168static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169float_print(v, fp, flags)
170 floatobject *v;
171 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000172 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173{
174 char buf[100];
175 float_buf_repr(buf, v);
176 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000177 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178}
179
180static object *
181float_repr(v)
182 floatobject *v;
183{
184 char buf[100];
185 float_buf_repr(buf, v);
186 return newstringobject(buf);
187}
188
189static int
190float_compare(v, w)
191 floatobject *v, *w;
192{
193 double i = v->ob_fval;
194 double j = w->ob_fval;
195 return (i < j) ? -1 : (i > j) ? 1 : 0;
196}
197
Guido van Rossum9bfef441993-03-29 10:43:31 +0000198static long
199float_hash(v)
200 floatobject *v;
201{
202 double intpart, fractpart;
203 int expo;
204 long x;
205 /* This is designed so that Python numbers with the same
206 value hash to the same value, otherwise comparisons
207 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000208
209#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
210{
211 extended e;
212 fractpart = modf(v->ob_fval, &e);
213 intpart = e;
214}
215#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000216 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000217#endif
218
Guido van Rossum9bfef441993-03-29 10:43:31 +0000219 if (fractpart == 0.0) {
220 if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
221 /* Convert to long int and use its hash... */
222 object *w = dnewlongobject(v->ob_fval);
223 if (w == NULL)
224 return -1;
225 x = hashobject(w);
226 DECREF(w);
227 return x;
228 }
229 x = (long)intpart;
230 }
231 else {
232 fractpart = frexp(fractpart, &expo);
Guido van Rossum6610ad91995-01-04 19:07:38 +0000233 fractpart = fractpart*2147483648.0; /* 2**31 */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000234 x = (long) (intpart + fractpart) ^ expo; /* Rather arbitrary */
235 }
236 if (x == -1)
237 x = -2;
238 return x;
239}
240
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241static object *
242float_add(v, w)
243 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000244 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000246 return newfloatobject(v->ob_fval + w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247}
248
249static object *
250float_sub(v, w)
251 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000252 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000254 return newfloatobject(v->ob_fval - w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255}
256
257static object *
258float_mul(v, w)
259 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000260 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000262 return newfloatobject(v->ob_fval * w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263}
264
265static object *
266float_div(v, w)
267 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000268 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000270 if (w->ob_fval == 0) {
Guido van Rossum9a9fadd1991-12-10 13:56:55 +0000271 err_setstr(ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272 return NULL;
273 }
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000274 return newfloatobject(v->ob_fval / w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275}
276
277static object *
278float_rem(v, w)
279 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000280 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000282 double vx, wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000283 double /* div, */ mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000284 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285 if (wx == 0.0) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000286 err_setstr(ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 return NULL;
288 }
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000289 vx = v->ob_fval;
290 mod = fmod(vx, wx);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000291 /* div = (vx - mod) / wx; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000292 if (wx*mod < 0) {
293 mod += wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000294 /* div -= 1.0; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000295 }
296 return newfloatobject(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297}
298
299static object *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000300float_divmod(v, w)
301 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000302 floatobject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000303{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000304 double vx, wx;
305 double div, mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000306 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000307 if (wx == 0.0) {
Guido van Rossum9a9fadd1991-12-10 13:56:55 +0000308 err_setstr(ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000309 return NULL;
310 }
311 vx = v->ob_fval;
312 mod = fmod(vx, wx);
313 div = (vx - mod) / wx;
314 if (wx*mod < 0) {
315 mod += wx;
316 div -= 1.0;
317 }
Guido van Rossume5372401993-03-16 12:15:04 +0000318 return mkvalue("(dd)", div, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000319}
320
Guido van Rossum363078a1996-05-24 20:45:01 +0000321static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000322 double x;
323 long n;
324{
325 double r = 1.;
326 double p = x;
327 long mask = 1;
328 while (mask > 0 && n >= mask) {
329 if (n & mask)
330 r *= p;
331 mask <<= 1;
332 p *= p;
333 }
334 return r;
335}
336
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000337static object *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000338float_pow(v, w, z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339 floatobject *v;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000340 object *w;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000341 floatobject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342{
343 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000344 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000345 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
346 * The z parameter is really only going to be useful for integers and
347 * long integers. Maybe something clever with logarithms could be done.
348 * [AMK]
349 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000350 iv = v->ob_fval;
351 iw = ((floatobject *)w)->ob_fval;
352 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000353 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000354 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000355 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000356 if ((object *)z!=None) {
357 ix=fmod(1.0, z->ob_fval);
358 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
359 }
360 else ix=1.0;
361 return newfloatobject(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000362 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000363 errno = 0;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000364 if (intw > 0)
365 ix = powu(iv, intw);
366 else
367 ix = 1./powu(iv, -intw);
Guido van Rossum86c04c21996-08-09 20:50:14 +0000368 }
369 else {
370 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000371 if (iv == 0.0) {
372 if (iw < 0.0) {
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000373 err_setstr(ValueError,
374 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000375 return NULL;
376 }
377 return newfloatobject(0.0);
378 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000379 if (iv < 0.0) {
380 err_setstr(ValueError,
381 "negative number to a float power");
382 return NULL;
383 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000384 errno = 0;
385 ix = pow(iv, iw);
Guido van Rossum70d93461991-05-28 21:57:39 +0000386 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000387 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000388 if (errno != 0) {
389 /* XXX could it be another type of error? */
390 err_errno(OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000392 }
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000393 if ((object *)z!=None) {
394 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
395 if ( ix!=0 &&
396 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
397 ix+=z->ob_fval;
398 }
399 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000400 return newfloatobject(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401}
402
403static object *
404float_neg(v)
405 floatobject *v;
406{
407 return newfloatobject(-v->ob_fval);
408}
409
410static object *
411float_pos(v)
412 floatobject *v;
413{
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000414 INCREF(v);
415 return (object *)v;
416}
417
418static object *
419float_abs(v)
420 floatobject *v;
421{
422 if (v->ob_fval < 0)
423 return float_neg(v);
424 else
425 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426}
427
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000428static int
429float_nonzero(v)
430 floatobject *v;
431{
432 return v->ob_fval != 0.0;
433}
434
Guido van Rossum234f9421993-06-17 12:35:49 +0000435static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000436float_coerce(pv, pw)
437 object **pv;
438 object **pw;
439{
440 if (is_intobject(*pw)) {
441 long x = getintvalue(*pw);
442 *pw = newfloatobject((double)x);
443 INCREF(*pv);
444 return 0;
445 }
446 else if (is_longobject(*pw)) {
447 *pw = newfloatobject(dgetlongvalue(*pw));
448 INCREF(*pv);
449 return 0;
450 }
451 return 1; /* Can't do it */
452}
453
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000454static object *
455float_int(v)
456 object *v;
457{
458 double x = getfloatvalue(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000459 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
460 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossum67ca7011995-02-13 16:38:41 +0000461 err_setstr(OverflowError, "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000462 return NULL;
463 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000464 return newintobject((long)x);
465}
466
467static object *
468float_long(v)
469 object *v;
470{
471 double x = getfloatvalue(v);
472 return dnewlongobject(x);
473}
474
475static object *
476float_float(v)
477 object *v;
478{
479 INCREF(v);
480 return v;
481}
482
483
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484static number_methods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000485 (binaryfunc)float_add, /*nb_add*/
486 (binaryfunc)float_sub, /*nb_subtract*/
487 (binaryfunc)float_mul, /*nb_multiply*/
488 (binaryfunc)float_div, /*nb_divide*/
489 (binaryfunc)float_rem, /*nb_remainder*/
490 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000491 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000492 (unaryfunc)float_neg, /*nb_negative*/
493 (unaryfunc)float_pos, /*nb_positive*/
494 (unaryfunc)float_abs, /*nb_absolute*/
495 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000496 0, /*nb_invert*/
497 0, /*nb_lshift*/
498 0, /*nb_rshift*/
499 0, /*nb_and*/
500 0, /*nb_xor*/
501 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000502 (coercion)float_coerce, /*nb_coerce*/
503 (unaryfunc)float_int, /*nb_int*/
504 (unaryfunc)float_long, /*nb_long*/
505 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000506 0, /*nb_oct*/
507 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000508};
509
510typeobject Floattype = {
511 OB_HEAD_INIT(&Typetype)
512 0,
513 "float",
514 sizeof(floatobject),
515 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000516 (destructor)float_dealloc, /*tp_dealloc*/
517 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000518 0, /*tp_getattr*/
519 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000520 (cmpfunc)float_compare, /*tp_compare*/
521 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522 &float_as_number, /*tp_as_number*/
523 0, /*tp_as_sequence*/
524 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000525 (hashfunc)float_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526};