blob: 1cebf8cecce266678cf5c865de129ae3d95d8cfb [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 {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000239 /* Note -- if you change this code, also change the copy
240 in complexobject.c */
241 long hipart;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000242 fractpart = frexp(fractpart, &expo);
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000243 fractpart = fractpart * 2147483648.0; /* 2**31 */
244 hipart = (long)fractpart; /* Take the top 32 bits */
245 fractpart = (fractpart - (double)hipart) * 2147483648.0;
246 /* Get the next 32 bits */
247 x = hipart + (long)fractpart + (long)intpart + (expo << 15);
248 /* Combine everything */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000249 }
250 if (x == -1)
251 x = -2;
252 return x;
253}
254
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255static object *
256float_add(v, w)
257 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000258 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000260 return newfloatobject(v->ob_fval + w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261}
262
263static object *
264float_sub(v, w)
265 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000266 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000268 return newfloatobject(v->ob_fval - w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269}
270
271static object *
272float_mul(v, w)
273 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000274 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000276 return newfloatobject(v->ob_fval * w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277}
278
279static object *
280float_div(v, w)
281 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000282 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000284 if (w->ob_fval == 0) {
Guido van Rossum9a9fadd1991-12-10 13:56:55 +0000285 err_setstr(ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 return NULL;
287 }
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000288 return newfloatobject(v->ob_fval / w->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289}
290
291static object *
292float_rem(v, w)
293 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000294 floatobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000296 double vx, wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000297 double /* div, */ mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000298 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 if (wx == 0.0) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000300 err_setstr(ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301 return NULL;
302 }
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000303 vx = v->ob_fval;
304 mod = fmod(vx, wx);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000305 /* div = (vx - mod) / wx; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000306 if (wx*mod < 0) {
307 mod += wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000308 /* div -= 1.0; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000309 }
310 return newfloatobject(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311}
312
313static object *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000314float_divmod(v, w)
315 floatobject *v;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000316 floatobject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000317{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000318 double vx, wx;
319 double div, mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000320 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000321 if (wx == 0.0) {
Guido van Rossum9a9fadd1991-12-10 13:56:55 +0000322 err_setstr(ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000323 return NULL;
324 }
325 vx = v->ob_fval;
326 mod = fmod(vx, wx);
327 div = (vx - mod) / wx;
328 if (wx*mod < 0) {
329 mod += wx;
330 div -= 1.0;
331 }
Guido van Rossume5372401993-03-16 12:15:04 +0000332 return mkvalue("(dd)", div, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000333}
334
Guido van Rossum363078a1996-05-24 20:45:01 +0000335static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000336 double x;
337 long n;
338{
339 double r = 1.;
340 double p = x;
341 long mask = 1;
342 while (mask > 0 && n >= mask) {
343 if (n & mask)
344 r *= p;
345 mask <<= 1;
346 p *= p;
347 }
348 return r;
349}
350
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000351static object *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000352float_pow(v, w, z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 floatobject *v;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000354 object *w;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000355 floatobject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356{
357 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000358 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000359 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
360 * The z parameter is really only going to be useful for integers and
361 * long integers. Maybe something clever with logarithms could be done.
362 * [AMK]
363 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000364 iv = v->ob_fval;
365 iw = ((floatobject *)w)->ob_fval;
366 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000367 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000368 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000369 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000370 if ((object *)z!=None) {
371 ix=fmod(1.0, z->ob_fval);
372 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
373 }
374 else ix=1.0;
375 return newfloatobject(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000376 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000377 errno = 0;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000378 if (intw > 0)
379 ix = powu(iv, intw);
380 else
381 ix = 1./powu(iv, -intw);
Guido van Rossum86c04c21996-08-09 20:50:14 +0000382 }
383 else {
384 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000385 if (iv == 0.0) {
386 if (iw < 0.0) {
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000387 err_setstr(ValueError,
388 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000389 return NULL;
390 }
391 return newfloatobject(0.0);
392 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000393 if (iv < 0.0) {
394 err_setstr(ValueError,
395 "negative number to a float power");
396 return NULL;
397 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000398 errno = 0;
399 ix = pow(iv, iw);
Guido van Rossum70d93461991-05-28 21:57:39 +0000400 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000401 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000402 if (errno != 0) {
403 /* XXX could it be another type of error? */
404 err_errno(OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000406 }
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000407 if ((object *)z!=None) {
408 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
409 if ( ix!=0 &&
410 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
411 ix+=z->ob_fval;
412 }
413 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000414 return newfloatobject(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415}
416
417static object *
418float_neg(v)
419 floatobject *v;
420{
421 return newfloatobject(-v->ob_fval);
422}
423
424static object *
425float_pos(v)
426 floatobject *v;
427{
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000428 INCREF(v);
429 return (object *)v;
430}
431
432static object *
433float_abs(v)
434 floatobject *v;
435{
436 if (v->ob_fval < 0)
437 return float_neg(v);
438 else
439 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440}
441
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000442static int
443float_nonzero(v)
444 floatobject *v;
445{
446 return v->ob_fval != 0.0;
447}
448
Guido van Rossum234f9421993-06-17 12:35:49 +0000449static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000450float_coerce(pv, pw)
451 object **pv;
452 object **pw;
453{
454 if (is_intobject(*pw)) {
455 long x = getintvalue(*pw);
456 *pw = newfloatobject((double)x);
457 INCREF(*pv);
458 return 0;
459 }
460 else if (is_longobject(*pw)) {
461 *pw = newfloatobject(dgetlongvalue(*pw));
462 INCREF(*pv);
463 return 0;
464 }
465 return 1; /* Can't do it */
466}
467
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000468static object *
469float_int(v)
470 object *v;
471{
472 double x = getfloatvalue(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000473 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
474 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossum67ca7011995-02-13 16:38:41 +0000475 err_setstr(OverflowError, "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000476 return NULL;
477 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000478 return newintobject((long)x);
479}
480
481static object *
482float_long(v)
483 object *v;
484{
485 double x = getfloatvalue(v);
486 return dnewlongobject(x);
487}
488
489static object *
490float_float(v)
491 object *v;
492{
493 INCREF(v);
494 return v;
495}
496
497
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498static number_methods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000499 (binaryfunc)float_add, /*nb_add*/
500 (binaryfunc)float_sub, /*nb_subtract*/
501 (binaryfunc)float_mul, /*nb_multiply*/
502 (binaryfunc)float_div, /*nb_divide*/
503 (binaryfunc)float_rem, /*nb_remainder*/
504 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000505 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000506 (unaryfunc)float_neg, /*nb_negative*/
507 (unaryfunc)float_pos, /*nb_positive*/
508 (unaryfunc)float_abs, /*nb_absolute*/
509 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000510 0, /*nb_invert*/
511 0, /*nb_lshift*/
512 0, /*nb_rshift*/
513 0, /*nb_and*/
514 0, /*nb_xor*/
515 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000516 (coercion)float_coerce, /*nb_coerce*/
517 (unaryfunc)float_int, /*nb_int*/
518 (unaryfunc)float_long, /*nb_long*/
519 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000520 0, /*nb_oct*/
521 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522};
523
524typeobject Floattype = {
525 OB_HEAD_INIT(&Typetype)
526 0,
527 "float",
528 sizeof(floatobject),
529 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000530 (destructor)float_dealloc, /*tp_dealloc*/
531 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000532 0, /*tp_getattr*/
533 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000534 (cmpfunc)float_compare, /*tp_compare*/
535 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000536 &float_as_number, /*tp_as_number*/
537 0, /*tp_as_sequence*/
538 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000539 (hashfunc)float_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540};