mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
New patches by Andrew to fix various problems
This commit is contained in:
parent
e149fa2a1e
commit
0b7d02a36f
1 changed files with 24 additions and 5 deletions
|
@ -290,19 +290,31 @@ float_divmod(v, w)
|
||||||
}
|
}
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
float_pow(v, w)
|
float_pow(v, w, z)
|
||||||
floatobject *v;
|
floatobject *v;
|
||||||
floatobject *w;
|
floatobject *w;
|
||||||
|
floatobject *z;
|
||||||
{
|
{
|
||||||
double iv, iw, ix;
|
double iv, iw, ix;
|
||||||
iv = v->ob_fval;
|
iv = v->ob_fval;
|
||||||
iw = w->ob_fval;
|
iw = w->ob_fval;
|
||||||
|
/* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
|
||||||
|
* The z parameter is really only going to be useful for integers and
|
||||||
|
* long integers. Maybe something clever with logarithms could be done.
|
||||||
|
* [AMK]
|
||||||
|
*/
|
||||||
/* Sort out special cases here instead of relying on pow() */
|
/* Sort out special cases here instead of relying on pow() */
|
||||||
if (iw == 0.0)
|
if (iw == 0.0) { /* x**0 is 1, even 0**0 */
|
||||||
return newfloatobject(1.0); /* x**0 is 1, even 0**0 */
|
if ((object *)z!=None) {
|
||||||
|
ix=fmod(1.0, z->ob_fval);
|
||||||
|
if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
|
||||||
|
}
|
||||||
|
else ix=1.0;
|
||||||
|
return newfloatobject(ix);
|
||||||
|
}
|
||||||
if (iv == 0.0) {
|
if (iv == 0.0) {
|
||||||
if (iw < 0.0) {
|
if (iw < 0.0) {
|
||||||
err_setstr(ValueError, "0.0 to the negative power");
|
err_setstr(ValueError, "0.0 to a negative power");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return newfloatobject(0.0);
|
return newfloatobject(0.0);
|
||||||
|
@ -319,6 +331,13 @@ float_pow(v, w)
|
||||||
err_errno(OverflowError);
|
err_errno(OverflowError);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if ((object *)z!=None) {
|
||||||
|
ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
|
||||||
|
if ( ix!=0 &&
|
||||||
|
((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
|
||||||
|
ix+=z->ob_fval;
|
||||||
|
}
|
||||||
|
}
|
||||||
return newfloatobject(ix);
|
return newfloatobject(ix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,7 +426,7 @@ static number_methods float_as_number = {
|
||||||
(binaryfunc)float_div, /*nb_divide*/
|
(binaryfunc)float_div, /*nb_divide*/
|
||||||
(binaryfunc)float_rem, /*nb_remainder*/
|
(binaryfunc)float_rem, /*nb_remainder*/
|
||||||
(binaryfunc)float_divmod, /*nb_divmod*/
|
(binaryfunc)float_divmod, /*nb_divmod*/
|
||||||
(binaryfunc)float_pow, /*nb_power*/
|
(ternaryfunc)float_pow, /*nb_power*/
|
||||||
(unaryfunc)float_neg, /*nb_negative*/
|
(unaryfunc)float_neg, /*nb_negative*/
|
||||||
(unaryfunc)float_pos, /*nb_positive*/
|
(unaryfunc)float_pos, /*nb_positive*/
|
||||||
(unaryfunc)float_abs, /*nb_absolute*/
|
(unaryfunc)float_abs, /*nb_absolute*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue