2 /* Float object implementation */
4 /* XXX There should be overflow checks here, but it's hard to check
5 for any kind of float exception without losing portability. */
11 #if !defined(__STDC__) && !defined(macintosh)
12 extern double fmod(double, double);
13 extern double pow(double, double);
16 #if defined(sun) && !defined(__SVR4)
17 /* On SunOS4.1 only libm.a exists. Make sure that references to all
18 needed math functions exist in the executable, so that dynamic
19 loading of mathmodule does not fail. */
20 double (*_Py_math_funcs_hack
[])() = {
21 acos
, asin
, atan
, atan2
, ceil
, cos
, cosh
, exp
, fabs
, floor
,
22 fmod
, log
, log10
, pow
, sin
, sinh
, sqrt
, tan
, tanh
26 /* Special free list -- see comments for same code in intobject.c. */
27 #define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
28 #define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
29 #define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
32 struct _floatblock
*next
;
33 PyFloatObject objects
[N_FLOATOBJECTS
];
36 typedef struct _floatblock PyFloatBlock
;
38 static PyFloatBlock
*block_list
= NULL
;
39 static PyFloatObject
*free_list
= NULL
;
41 static PyFloatObject
*
45 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
46 p
= (PyFloatObject
*) PyMem_MALLOC(sizeof(PyFloatBlock
));
48 return (PyFloatObject
*) PyErr_NoMemory();
49 ((PyFloatBlock
*)p
)->next
= block_list
;
50 block_list
= (PyFloatBlock
*)p
;
51 p
= &((PyFloatBlock
*)p
)->objects
[0];
52 q
= p
+ N_FLOATOBJECTS
;
54 q
->ob_type
= (struct _typeobject
*)(q
-1);
56 return p
+ N_FLOATOBJECTS
- 1;
60 PyFloat_FromDouble(double fval
)
62 register PyFloatObject
*op
;
63 if (free_list
== NULL
) {
64 if ((free_list
= fill_free_list()) == NULL
)
67 /* PyObject_New is inlined */
69 free_list
= (PyFloatObject
*)op
->ob_type
;
70 PyObject_INIT(op
, &PyFloat_Type
);
72 return (PyObject
*) op
;
75 /**************************************************************************
76 RED_FLAG 22-Sep-2000 tim
77 PyFloat_FromString's pend argument is braindead. Prior to this RED_FLAG,
79 1. If v was a regular string, *pend was set to point to its terminating
80 null byte. That's useless (the caller can find that without any
81 help from this function!).
83 2. If v was a Unicode string, or an object convertible to a character
84 buffer, *pend was set to point into stack trash (the auto temp
85 vector holding the character buffer). That was downright dangerous.
87 Since we can't change the interface of a public API function, pend is
88 still supported but now *officially* useless: if pend is not NULL,
90 **************************************************************************/
92 PyFloat_FromString(PyObject
*v
, char **pend
)
94 const char *s
, *last
, *end
;
96 char buffer
[256]; /* for errors */
97 #ifdef Py_USING_UNICODE
98 char s_buffer
[256]; /* for objects convertible to a char buffer */
104 if (PyString_Check(v
)) {
105 s
= PyString_AS_STRING(v
);
106 len
= PyString_GET_SIZE(v
);
108 #ifdef Py_USING_UNICODE
109 else if (PyUnicode_Check(v
)) {
110 if (PyUnicode_GET_SIZE(v
) >= sizeof(s_buffer
)) {
111 PyErr_SetString(PyExc_ValueError
,
112 "Unicode float() literal too long to convert");
115 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v
),
116 PyUnicode_GET_SIZE(v
),
121 len
= (int)strlen(s
);
124 else if (PyObject_AsCharBuffer(v
, &s
, &len
)) {
125 PyErr_SetString(PyExc_TypeError
,
126 "float() needs a string argument");
131 while (*s
&& isspace(Py_CHARMASK(*s
)))
134 PyErr_SetString(PyExc_ValueError
, "empty string for float()");
137 /* We don't care about overflow or underflow. If the platform supports
138 * them, infinities and signed zeroes (on underflow) are fine.
139 * However, strtod can return 0 for denormalized numbers, where atof
140 * does not. So (alas!) we special-case a zero result. Note that
141 * whether strtod sets errno on underflow is not defined, so we can't
144 PyFPE_START_PROTECT("strtod", return NULL
)
145 x
= strtod(s
, (char **)&end
);
148 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
149 byte at the end of the string, when the input is inf(inity). */
153 PyOS_snprintf(buffer
, sizeof(buffer
),
154 "invalid literal for float(): %.200s", s
);
155 PyErr_SetString(PyExc_ValueError
, buffer
);
158 /* Since end != s, the platform made *some* kind of sense out
159 of the input. Trust it. */
160 while (*end
&& isspace(Py_CHARMASK(*end
)))
163 PyOS_snprintf(buffer
, sizeof(buffer
),
164 "invalid literal for float(): %.200s", s
);
165 PyErr_SetString(PyExc_ValueError
, buffer
);
168 else if (end
!= last
) {
169 PyErr_SetString(PyExc_ValueError
,
170 "null byte in argument for float()");
174 /* See above -- may have been strtod being anal
176 PyFPE_START_PROTECT("atof", return NULL
)
179 errno
= 0; /* whether atof ever set errno is undefined */
181 return PyFloat_FromDouble(x
);
185 float_dealloc(PyFloatObject
*op
)
187 if (PyFloat_CheckExact(op
)) {
188 op
->ob_type
= (struct _typeobject
*)free_list
;
192 op
->ob_type
->tp_free((PyObject
*)op
);
196 PyFloat_AsDouble(PyObject
*op
)
202 if (op
&& PyFloat_Check(op
))
203 return PyFloat_AS_DOUBLE((PyFloatObject
*) op
);
205 if (op
== NULL
|| (nb
= op
->ob_type
->tp_as_number
) == NULL
||
206 nb
->nb_float
== NULL
) {
211 fo
= (PyFloatObject
*) (*nb
->nb_float
) (op
);
214 if (!PyFloat_Check(fo
)) {
215 PyErr_SetString(PyExc_TypeError
,
216 "nb_float should return float object");
220 val
= PyFloat_AS_DOUBLE(fo
);
229 format_float(char *buf
, size_t buflen
, PyFloatObject
*v
, int precision
)
232 /* Subroutine for float_repr and float_print.
233 We want float numbers to be recognizable as such,
234 i.e., they should contain a decimal point or an exponent.
235 However, %g may print the number as an integer;
236 in such cases, we append ".0" to the string. */
238 assert(PyFloat_Check(v
));
239 PyOS_snprintf(buf
, buflen
, "%.*g", precision
, v
->ob_fval
);
243 for (; *cp
!= '\0'; cp
++) {
244 /* Any non-digit means it's not an integer;
245 this takes care of NAN and INF as well. */
246 if (!isdigit(Py_CHARMASK(*cp
)))
256 /* XXX PyFloat_AsStringEx should not be a public API function (for one
257 XXX thing, its signature passes a buffer without a length; for another,
258 XXX it isn't useful outside this file).
261 PyFloat_AsStringEx(char *buf
, PyFloatObject
*v
, int precision
)
263 format_float(buf
, 100, v
, precision
);
266 /* Macro and helper that convert PyObject obj to a C double and store
267 the value in dbl; this replaces the functionality of the coercion
270 #define CONVERT_TO_DOUBLE(obj, dbl) \
271 if (PyFloat_Check(obj)) \
272 dbl = PyFloat_AS_DOUBLE(obj); \
273 else if (convert_to_double(&(obj), &(dbl)) < 0) \
277 convert_to_double(PyObject
**v
, double *dbl
)
279 register PyObject
*obj
= *v
;
281 if (PyInt_Check(obj
)) {
282 *dbl
= (double)PyInt_AS_LONG(obj
);
284 else if (PyLong_Check(obj
)) {
285 *dbl
= PyLong_AsDouble(obj
);
286 if (*dbl
== -1.0 && PyErr_Occurred()) {
292 Py_INCREF(Py_NotImplemented
);
293 *v
= Py_NotImplemented
;
299 /* Precisions used by repr() and str(), respectively.
301 The repr() precision (17 significant decimal digits) is the minimal number
302 that is guaranteed to have enough precision so that if the number is read
303 back in the exact same binary value is recreated. This is true for IEEE
304 floating point by design, and also happens to work for all other modern
307 The str() precision is chosen so that in most cases, the rounding noise
308 created by various operations is suppressed, while giving plenty of
309 precision for practical use.
316 /* XXX PyFloat_AsString and PyFloat_AsReprString should be deprecated:
317 XXX they pass a char buffer without passing a length.
320 PyFloat_AsString(char *buf
, PyFloatObject
*v
)
322 format_float(buf
, 100, v
, PREC_STR
);
326 PyFloat_AsReprString(char *buf
, PyFloatObject
*v
)
328 format_float(buf
, 100, v
, PREC_REPR
);
333 float_print(PyFloatObject
*v
, FILE *fp
, int flags
)
336 format_float(buf
, sizeof(buf
), v
,
337 (flags
& Py_PRINT_RAW
) ? PREC_STR
: PREC_REPR
);
343 float_repr(PyFloatObject
*v
)
346 format_float(buf
, sizeof(buf
), v
, PREC_REPR
);
347 return PyString_FromString(buf
);
351 float_str(PyFloatObject
*v
)
354 format_float(buf
, sizeof(buf
), v
, PREC_STR
);
355 return PyString_FromString(buf
);
359 float_compare(PyFloatObject
*v
, PyFloatObject
*w
)
361 double i
= v
->ob_fval
;
362 double j
= w
->ob_fval
;
363 return (i
< j
) ? -1 : (i
> j
) ? 1 : 0;
367 float_hash(PyFloatObject
*v
)
369 return _Py_HashDouble(v
->ob_fval
);
373 float_add(PyObject
*v
, PyObject
*w
)
376 CONVERT_TO_DOUBLE(v
, a
);
377 CONVERT_TO_DOUBLE(w
, b
);
378 PyFPE_START_PROTECT("add", return 0)
381 return PyFloat_FromDouble(a
);
385 float_sub(PyObject
*v
, PyObject
*w
)
388 CONVERT_TO_DOUBLE(v
, a
);
389 CONVERT_TO_DOUBLE(w
, b
);
390 PyFPE_START_PROTECT("subtract", return 0)
393 return PyFloat_FromDouble(a
);
397 float_mul(PyObject
*v
, PyObject
*w
)
400 CONVERT_TO_DOUBLE(v
, a
);
401 CONVERT_TO_DOUBLE(w
, b
);
402 PyFPE_START_PROTECT("multiply", return 0)
405 return PyFloat_FromDouble(a
);
409 float_div(PyObject
*v
, PyObject
*w
)
412 CONVERT_TO_DOUBLE(v
, a
);
413 CONVERT_TO_DOUBLE(w
, b
);
415 PyErr_SetString(PyExc_ZeroDivisionError
, "float division");
418 PyFPE_START_PROTECT("divide", return 0)
421 return PyFloat_FromDouble(a
);
425 float_classic_div(PyObject
*v
, PyObject
*w
)
428 CONVERT_TO_DOUBLE(v
, a
);
429 CONVERT_TO_DOUBLE(w
, b
);
430 if (Py_DivisionWarningFlag
>= 2 &&
431 PyErr_Warn(PyExc_DeprecationWarning
, "classic float division") < 0)
434 PyErr_SetString(PyExc_ZeroDivisionError
, "float division");
437 PyFPE_START_PROTECT("divide", return 0)
440 return PyFloat_FromDouble(a
);
444 float_rem(PyObject
*v
, PyObject
*w
)
448 CONVERT_TO_DOUBLE(v
, vx
);
449 CONVERT_TO_DOUBLE(w
, wx
);
451 PyErr_SetString(PyExc_ZeroDivisionError
, "float modulo");
454 PyFPE_START_PROTECT("modulo", return 0)
456 /* note: checking mod*wx < 0 is incorrect -- underflows to
457 0 if wx < sqrt(smallest nonzero double) */
458 if (mod
&& ((wx
< 0) != (mod
< 0))) {
461 PyFPE_END_PROTECT(mod
)
462 return PyFloat_FromDouble(mod
);
466 float_divmod(PyObject
*v
, PyObject
*w
)
469 double div
, mod
, floordiv
;
470 CONVERT_TO_DOUBLE(v
, vx
);
471 CONVERT_TO_DOUBLE(w
, wx
);
473 PyErr_SetString(PyExc_ZeroDivisionError
, "float divmod()");
476 PyFPE_START_PROTECT("divmod", return 0)
478 /* fmod is typically exact, so vx-mod is *mathematically* an
479 exact multiple of wx. But this is fp arithmetic, and fp
480 vx - mod is an approximation; the result is that div may
481 not be an exact integral value after the division, although
482 it will always be very close to one.
484 div
= (vx
- mod
) / wx
;
486 /* ensure the remainder has the same sign as the denominator */
487 if ((wx
< 0) != (mod
< 0)) {
493 /* the remainder is zero, and in the presence of signed zeroes
494 fmod returns different results across platforms; ensure
495 it has the same sign as the denominator; we'd like to do
496 "mod = wx * 0.0", but that may get optimized away */
497 mod
*= mod
; /* hide "mod = +0" from optimizer */
501 /* snap quotient to nearest integral value */
503 floordiv
= floor(div
);
504 if (div
- floordiv
> 0.5)
508 /* div is zero - get the same sign as the true quotient */
509 div
*= div
; /* hide "div = +0" from optimizers */
510 floordiv
= div
* vx
/ wx
; /* zero w/ sign of vx/wx */
512 PyFPE_END_PROTECT(floordiv
)
513 return Py_BuildValue("(dd)", floordiv
, mod
);
517 float_pow(PyObject
*v
, PyObject
*w
, PyObject
*z
)
521 if ((PyObject
*)z
!= Py_None
) {
522 PyErr_SetString(PyExc_TypeError
, "pow() 3rd argument not "
523 "allowed unless all arguments are integers");
527 CONVERT_TO_DOUBLE(v
, iv
);
528 CONVERT_TO_DOUBLE(w
, iw
);
530 /* Sort out special cases here instead of relying on pow() */
531 if (iw
== 0) { /* v**0 is 1, even 0**0 */
532 PyFPE_START_PROTECT("pow", return NULL
)
533 if ((PyObject
*)z
!= Py_None
) {
535 CONVERT_TO_DOUBLE(z
, iz
);
537 if (ix
!= 0 && iz
< 0)
542 PyFPE_END_PROTECT(ix
)
543 return PyFloat_FromDouble(ix
);
545 if (iv
== 0.0) { /* 0**w is error if w<0, else 1 */
547 PyErr_SetString(PyExc_ZeroDivisionError
,
548 "0.0 cannot be raised to a negative power");
551 return PyFloat_FromDouble(0.0);
553 if (iv
< 0.0 && iw
!= floor(iw
)) {
554 PyErr_SetString(PyExc_ValueError
,
555 "negative number cannot be raised to a fractional power");
559 PyFPE_START_PROTECT("pow", return NULL
)
561 PyFPE_END_PROTECT(ix
)
562 Py_SET_ERANGE_IF_OVERFLOW(ix
);
564 /* XXX could it be another type of error? */
565 PyErr_SetFromErrno(PyExc_OverflowError
);
568 return PyFloat_FromDouble(ix
);
572 float_int_div(PyObject
*v
, PyObject
*w
)
576 t
= float_divmod(v
, w
);
578 r
= PyTuple_GET_ITEM(t
, 0);
587 float_neg(PyFloatObject
*v
)
589 return PyFloat_FromDouble(-v
->ob_fval
);
593 float_pos(PyFloatObject
*v
)
595 if (PyFloat_CheckExact(v
)) {
597 return (PyObject
*)v
;
600 return PyFloat_FromDouble(v
->ob_fval
);
604 float_abs(PyFloatObject
*v
)
606 return PyFloat_FromDouble(fabs(v
->ob_fval
));
610 float_nonzero(PyFloatObject
*v
)
612 return v
->ob_fval
!= 0.0;
616 float_coerce(PyObject
**pv
, PyObject
**pw
)
618 if (PyInt_Check(*pw
)) {
619 long x
= PyInt_AsLong(*pw
);
620 *pw
= PyFloat_FromDouble((double)x
);
624 else if (PyLong_Check(*pw
)) {
625 *pw
= PyFloat_FromDouble(PyLong_AsDouble(*pw
));
629 else if (PyFloat_Check(*pw
)) {
634 return 1; /* Can't do it */
638 float_int(PyObject
*v
)
640 double x
= PyFloat_AsDouble(v
);
641 double wholepart
; /* integral portion of x, rounded toward 0 */
642 long aslong
; /* (long)wholepart */
644 (void)modf(x
, &wholepart
);
646 /* conversion from floating to integral type would raise exception */
647 if (wholepart
>LONG_MAX
|| wholepart
<LONG_MIN
) {
648 PyErr_SetString(PyExc_OverflowError
, "float too large to convert");
652 /* doubles may have more bits than longs, or vice versa; and casting
653 to long may yield gibberish in either case. What really matters
654 is whether converting back to double again reproduces what we
656 aslong
= (long)wholepart
;
657 if ((double)aslong
== wholepart
)
658 return PyInt_FromLong(aslong
);
659 PyErr_SetString(PyExc_OverflowError
, "float too large to convert");
664 float_long(PyObject
*v
)
666 double x
= PyFloat_AsDouble(v
);
667 return PyLong_FromDouble(x
);
671 float_float(PyObject
*v
)
678 staticforward PyObject
*
679 float_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
);
682 float_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
684 PyObject
*x
= Py_False
; /* Integer zero */
685 static char *kwlist
[] = {"x", 0};
687 if (type
!= &PyFloat_Type
)
688 return float_subtype_new(type
, args
, kwds
); /* Wimp out */
689 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "|O:float", kwlist
, &x
))
691 if (PyString_Check(x
))
692 return PyFloat_FromString(x
, NULL
);
693 return PyNumber_Float(x
);
696 /* Wimpy, slow approach to tp_new calls for subtypes of float:
697 first create a regular float from whatever arguments we got,
698 then allocate a subtype instance and initialize its ob_fval
699 from the regular float. The regular float is then thrown away.
702 float_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
706 assert(PyType_IsSubtype(type
, &PyFloat_Type
));
707 tmp
= float_new(&PyFloat_Type
, args
, kwds
);
710 assert(PyFloat_CheckExact(tmp
));
711 new = type
->tp_alloc(type
, 0);
714 ((PyFloatObject
*)new)->ob_fval
= ((PyFloatObject
*)tmp
)->ob_fval
;
719 static char float_doc
[] =
720 "float(x) -> floating point number\n\
722 Convert a string or number to a floating point number, if possible.";
725 static PyNumberMethods float_as_number
= {
726 (binaryfunc
)float_add
, /*nb_add*/
727 (binaryfunc
)float_sub
, /*nb_subtract*/
728 (binaryfunc
)float_mul
, /*nb_multiply*/
729 (binaryfunc
)float_classic_div
, /*nb_divide*/
730 (binaryfunc
)float_rem
, /*nb_remainder*/
731 (binaryfunc
)float_divmod
, /*nb_divmod*/
732 (ternaryfunc
)float_pow
, /*nb_power*/
733 (unaryfunc
)float_neg
, /*nb_negative*/
734 (unaryfunc
)float_pos
, /*nb_positive*/
735 (unaryfunc
)float_abs
, /*nb_absolute*/
736 (inquiry
)float_nonzero
, /*nb_nonzero*/
743 (coercion
)float_coerce
, /*nb_coerce*/
744 (unaryfunc
)float_int
, /*nb_int*/
745 (unaryfunc
)float_long
, /*nb_long*/
746 (unaryfunc
)float_float
, /*nb_float*/
749 0, /* nb_inplace_add */
750 0, /* nb_inplace_subtract */
751 0, /* nb_inplace_multiply */
752 0, /* nb_inplace_divide */
753 0, /* nb_inplace_remainder */
754 0, /* nb_inplace_power */
755 0, /* nb_inplace_lshift */
756 0, /* nb_inplace_rshift */
757 0, /* nb_inplace_and */
758 0, /* nb_inplace_xor */
759 0, /* nb_inplace_or */
760 float_int_div
, /* nb_floor_divide */
761 float_div
, /* nb_true_divide */
762 0, /* nb_inplace_floor_divide */
763 0, /* nb_inplace_true_divide */
766 PyTypeObject PyFloat_Type
= {
767 PyObject_HEAD_INIT(&PyType_Type
)
770 sizeof(PyFloatObject
),
772 (destructor
)float_dealloc
, /* tp_dealloc */
773 (printfunc
)float_print
, /* tp_print */
776 (cmpfunc
)float_compare
, /* tp_compare */
777 (reprfunc
)float_repr
, /* tp_repr */
778 &float_as_number
, /* tp_as_number */
779 0, /* tp_as_sequence */
780 0, /* tp_as_mapping */
781 (hashfunc
)float_hash
, /* tp_hash */
783 (reprfunc
)float_str
, /* tp_str */
784 PyObject_GenericGetAttr
, /* tp_getattro */
786 0, /* tp_as_buffer */
787 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_CHECKTYPES
|
788 Py_TPFLAGS_BASETYPE
, /* tp_flags */
789 float_doc
, /* tp_doc */
792 0, /* tp_richcompare */
793 0, /* tp_weaklistoffset */
801 0, /* tp_descr_get */
802 0, /* tp_descr_set */
803 0, /* tp_dictoffset */
806 float_new
, /* tp_new */
813 PyFloatBlock
*list
, *next
;
815 int bc
, bf
; /* block count, number of freed blocks */
816 int frem
, fsum
; /* remaining unfreed floats per block, total */
824 while (list
!= NULL
) {
827 for (i
= 0, p
= &list
->objects
[0];
830 if (PyFloat_CheckExact(p
) && p
->ob_refcnt
!= 0)
835 list
->next
= block_list
;
837 for (i
= 0, p
= &list
->objects
[0];
840 if (!PyFloat_CheckExact(p
) ||
842 p
->ob_type
= (struct _typeobject
*)
849 PyMem_FREE(list
); /* XXX PyObject_FREE ??? */
857 fprintf(stderr
, "# cleanup floats");
859 fprintf(stderr
, "\n");
863 ": %d unfreed float%s in %d out of %d block%s\n",
864 fsum
, fsum
== 1 ? "" : "s",
865 bc
- bf
, bc
, bc
== 1 ? "" : "s");
867 if (Py_VerboseFlag
> 1) {
869 while (list
!= NULL
) {
870 for (i
= 0, p
= &list
->objects
[0];
873 if (PyFloat_CheckExact(p
) &&
876 PyFloat_AsString(buf
, p
);
878 "# <float at %p, refcnt=%d, val=%s>\n",
879 p
, p
->ob_refcnt
, buf
);