blob: cc0b98a87c5d51aca2307f3a7de34a8f599927cf [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(_MSC_VER) && _MSC_VER < 850
43#define CHECK(x) /* errno is always set VC++ Ver 1.5*/
44#endif
45
46#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000047#define CHECK(x) if (errno != 0) ; \
48 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
49 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000050#endif
51
52#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000053#define CHECK(x) /* Don't know how to check */
54#endif
55
Guido van Rossum03093a21994-09-28 15:51:32 +000056#ifdef HAVE_LIMITS_H
57#include <limits.h>
58#endif
59
60#ifndef LONG_MAX
61#define LONG_MAX 0X7FFFFFFFL
62#endif
63
64#ifndef LONG_MIN
65#define LONG_MIN (-LONG_MAX-1)
66#endif
67
Guido van Rossum67ca7011995-02-13 16:38:41 +000068#ifdef __NeXT__
69#ifdef __sparc__
70/*
71 * This works around a bug in the NS/Sparc 3.3 pre-release
72 * limits.h header file.
73 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
74 */
75#undef LONG_MIN
76#define LONG_MIN (-LONG_MAX-1)
77#endif
78#endif
79
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000080#if !defined(__STDC__) && !defined(macintosh)
Guido van Rossum6923e131990-11-02 17:50:43 +000081extern double fmod PROTO((double, double));
82extern double pow PROTO((double, double));
83#endif
84
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085object *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000086#ifdef __SC__
87newfloatobject(double fval)
88#else
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089newfloatobject(fval)
90 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000091#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092{
93 /* For efficiency, this code is copied from newobject() */
94 register floatobject *op = (floatobject *) malloc(sizeof(floatobject));
Guido van Rossum2a9096b1990-10-21 22:15:08 +000095 if (op == NULL)
96 return err_nomem();
Guido van Rossum2a9096b1990-10-21 22:15:08 +000097 op->ob_type = &Floattype;
98 op->ob_fval = fval;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000099 NEWREF(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100 return (object *) op;
101}
102
Guido van Rossum234f9421993-06-17 12:35:49 +0000103static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000104float_dealloc(op)
105 object *op;
106{
107 DEL(op);
108}
109
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110double
111getfloatvalue(op)
112 object *op;
113{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000114 number_methods *nb;
115 floatobject *fo;
116 double val;
117
118 if (op && is_floatobject(op))
119 return GETFLOATVALUE((floatobject*) op);
120
121 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
122 nb->nb_float == NULL) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000123 err_badarg();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 return -1;
125 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126
127 fo = (floatobject*) (*nb->nb_float) (op);
128 if (fo == NULL)
129 return -1;
130 if (!is_floatobject(fo)) {
131 err_setstr(TypeError, "nb_float should return float object");
132 return -1;
133 }
134
135 val = GETFLOATVALUE(fo);
136 DECREF(fo);
137
138 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139}
140
141/* Methods */
142
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000143void
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144float_buf_repr(buf, v)
145 char *buf;
146 floatobject *v;
147{
148 register char *cp;
149 /* Subroutine for float_repr and float_print.
150 We want float numbers to be recognizable as such,
151 i.e., they should contain a decimal point or an exponent.
152 However, %g may print the number as an integer;
153 in such cases, we append ".0" to the string. */
154 sprintf(buf, "%.12g", v->ob_fval);
155 cp = buf;
156 if (*cp == '-')
157 cp++;
158 for (; *cp != '\0'; cp++) {
159 /* Any non-digit means it's not an integer;
160 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000161 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162 break;
163 }
164 if (*cp == '\0') {
165 *cp++ = '.';
166 *cp++ = '0';
167 *cp++ = '\0';
168 }
169}
170
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000171/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000172static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173float_print(v, fp, flags)
174 floatobject *v;
175 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000176 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177{
178 char buf[100];
179 float_buf_repr(buf, v);
180 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000181 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182}
183
184static object *
185float_repr(v)
186 floatobject *v;
187{
188 char buf[100];
189 float_buf_repr(buf, v);
190 return newstringobject(buf);
191}
192
193static int
194float_compare(v, w)
195 floatobject *v, *w;
196{
197 double i = v->ob_fval;
198 double j = w->ob_fval;
199 return (i < j) ? -1 : (i > j) ? 1 : 0;
200}
201
Guido van Rossum9bfef441993-03-29 10:43:31 +0000202static long
203float_hash(v)
204 floatobject *v;
205{
206 double intpart, fractpart;
207 int expo;
208 long x;
209 /* This is designed so that Python numbers with the same
210 value hash to the same value, otherwise comparisons
211 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000212
213#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
214{
215 extended e;
216 fractpart = modf(v->ob_fval, &e);
217 intpart = e;
218}
219#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000220 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000221#endif
222
Guido van Rossum9bfef441993-03-29 10:43:31 +0000223 if (fractpart == 0.0) {
224 if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
225 /* Convert to long int and use its hash... */
226 object *w = dnewlongobject(v->ob_fval);
227 if (w == NULL)
228 return -1;
229 x = hashobject(w);
230 DECREF(w);
231 return x;
232 }
233 x = (long)intpart;
234 }
235 else {
236 fractpart = frexp(fractpart, &expo);
Guido van Rossum6610ad91995-01-04 19:07:38 +0000237 fractpart = fractpart*2147483648.0; /* 2**31 */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 x = (long) (intpart + fractpart) ^ expo; /* Rather arbitrary */
239 }
240 if (x == -1)
241 x = -2;
242 return x;
243}
244
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245static object *
246float_add(v, w)
247 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000248 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000250 return newfloatobject(v->ob_fval + w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251}
252
253static object *
254float_sub(v, w)
255 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000256 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000258 return newfloatobject(v->ob_fval - w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259}
260
261static object *
262float_mul(v, w)
263 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000264 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000266 return newfloatobject(v->ob_fval * w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267}
268
269static object *
270float_div(v, w)
271 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000272 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000274 if (w->ob_fval == 0) {
Guido van Rossum9a9fadd1991-12-10 13:56:55 +0000275 err_setstr(ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276 return NULL;
277 }
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000278 return newfloatobject(v->ob_fval / w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279}
280
281static object *
282float_rem(v, w)
283 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000284 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000286 double vx, wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000287 double /* div, */ mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000288 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 if (wx == 0.0) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000290 err_setstr(ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 return NULL;
292 }
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000293 vx = v->ob_fval;
294 mod = fmod(vx, wx);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000295 /* div = (vx - mod) / wx; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000296 if (wx*mod < 0) {
297 mod += wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000298 /* div -= 1.0; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000299 }
300 return newfloatobject(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301}
302
303static object *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000304float_divmod(v, w)
305 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000306 floatobject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000307{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000308 double vx, wx;
309 double div, mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000310 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000311 if (wx == 0.0) {
Guido van Rossum9a9fadd1991-12-10 13:56:55 +0000312 err_setstr(ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000313 return NULL;
314 }
315 vx = v->ob_fval;
316 mod = fmod(vx, wx);
317 div = (vx - mod) / wx;
318 if (wx*mod < 0) {
319 mod += wx;
320 div -= 1.0;
321 }
Guido van Rossume5372401993-03-16 12:15:04 +0000322 return mkvalue("(dd)", div, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000323}
324
Guido van Rossum363078a1996-05-24 20:45:01 +0000325static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000326 double x;
327 long n;
328{
329 double r = 1.;
330 double p = x;
331 long mask = 1;
332 while (mask > 0 && n >= mask) {
333 if (n & mask)
334 r *= p;
335 mask <<= 1;
336 p *= p;
337 }
338 return r;
339}
340
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000341static object *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000342float_pow(v, w, z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 floatobject *v;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000344 object *w;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000345 floatobject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346{
347 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000348 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000349 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
350 * The z parameter is really only going to be useful for integers and
351 * long integers. Maybe something clever with logarithms could be done.
352 * [AMK]
353 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000354 iv = v->ob_fval;
355 iw = ((floatobject *)w)->ob_fval;
356 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000357 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000358 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000359 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000360 if ((object *)z!=None) {
361 ix=fmod(1.0, z->ob_fval);
362 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
363 }
364 else ix=1.0;
365 return newfloatobject(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000366 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000367 errno = 0;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000368 if (intw > 0)
369 ix = powu(iv, intw);
370 else
371 ix = 1./powu(iv, -intw);
Guido van Rossum86c04c21996-08-09 20:50:14 +0000372 }
373 else {
374 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000375 if (iv == 0.0) {
376 if (iw < 0.0) {
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000377 err_setstr(ValueError,
378 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000379 return NULL;
380 }
381 return newfloatobject(0.0);
382 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000383 if (iv < 0.0) {
384 err_setstr(ValueError,
385 "negative number to a float power");
386 return NULL;
387 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000388 errno = 0;
389 ix = pow(iv, iw);
Guido van Rossum70d93461991-05-28 21:57:39 +0000390 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000391 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000392 if (errno != 0) {
393 /* XXX could it be another type of error? */
394 err_errno(OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000396 }
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000397 if ((object *)z!=None) {
398 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
399 if ( ix!=0 &&
400 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
401 ix+=z->ob_fval;
402 }
403 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000404 return newfloatobject(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405}
406
407static object *
408float_neg(v)
409 floatobject *v;
410{
411 return newfloatobject(-v->ob_fval);
412}
413
414static object *
415float_pos(v)
416 floatobject *v;
417{
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000418 INCREF(v);
419 return (object *)v;
420}
421
422static object *
423float_abs(v)
424 floatobject *v;
425{
426 if (v->ob_fval < 0)
427 return float_neg(v);
428 else
429 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430}
431
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000432static int
433float_nonzero(v)
434 floatobject *v;
435{
436 return v->ob_fval != 0.0;
437}
438
Guido van Rossum234f9421993-06-17 12:35:49 +0000439static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000440float_coerce(pv, pw)
441 object **pv;
442 object **pw;
443{
444 if (is_intobject(*pw)) {
445 long x = getintvalue(*pw);
446 *pw = newfloatobject((double)x);
447 INCREF(*pv);
448 return 0;
449 }
450 else if (is_longobject(*pw)) {
451 *pw = newfloatobject(dgetlongvalue(*pw));
452 INCREF(*pv);
453 return 0;
454 }
455 return 1; /* Can't do it */
456}
457
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000458static object *
459float_int(v)
460 object *v;
461{
462 double x = getfloatvalue(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000463 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
464 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossum67ca7011995-02-13 16:38:41 +0000465 err_setstr(OverflowError, "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000466 return NULL;
467 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000468 return newintobject((long)x);
469}
470
471static object *
472float_long(v)
473 object *v;
474{
475 double x = getfloatvalue(v);
476 return dnewlongobject(x);
477}
478
479static object *
480float_float(v)
481 object *v;
482{
483 INCREF(v);
484 return v;
485}
486
487
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000488static number_methods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000489 (binaryfunc)float_add, /*nb_add*/
490 (binaryfunc)float_sub, /*nb_subtract*/
491 (binaryfunc)float_mul, /*nb_multiply*/
492 (binaryfunc)float_div, /*nb_divide*/
493 (binaryfunc)float_rem, /*nb_remainder*/
494 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000495 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000496 (unaryfunc)float_neg, /*nb_negative*/
497 (unaryfunc)float_pos, /*nb_positive*/
498 (unaryfunc)float_abs, /*nb_absolute*/
499 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000500 0, /*nb_invert*/
501 0, /*nb_lshift*/
502 0, /*nb_rshift*/
503 0, /*nb_and*/
504 0, /*nb_xor*/
505 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000506 (coercion)float_coerce, /*nb_coerce*/
507 (unaryfunc)float_int, /*nb_int*/
508 (unaryfunc)float_long, /*nb_long*/
509 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000510 0, /*nb_oct*/
511 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512};
513
514typeobject Floattype = {
515 OB_HEAD_INIT(&Typetype)
516 0,
517 "float",
518 sizeof(floatobject),
519 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000520 (destructor)float_dealloc, /*tp_dealloc*/
521 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522 0, /*tp_getattr*/
523 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000524 (cmpfunc)float_compare, /*tp_compare*/
525 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526 &float_as_number, /*tp_as_number*/
527 0, /*tp_as_sequence*/
528 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000529 (hashfunc)float_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000530};