3-arg float pow()

Tim Peters tim.one at home.com
Wed Sep 5 08:37:09 CEST 2001

```>> TypeError: 3rd argument to floating pow() must be None

[Gareth McCaughan]
> Can I put in a request for "or omitted", or something of
> the kind, to go on the end of that error message?

>> TypeError: integer pow() arg 3 must not be specified when arg 2 is < 0

> And for the messages in those two cases to be made more
> consistent?

Sure!  These were changed, to

pow() 3rd argument cannot be 0
pow() 2nd argument cannot be negative when 3rd argument specified
pow() 3rd argument not allowed unless all other arguments are integers

> ...
> Oh, one other thing. Giving a third argument of 0 should
> probably be equivalent to giving a third argument of None

Sorry, not a chance.  You can make up any argument you want, but it remains
100x more likely that someone doing

pow(i, j, k)

when k is 0 has made an error than that they're trying to exploit some
clever argument, of which, as you say:

> ...
> I don't think any programming language agrees with me...

> (Rationale:
>
>   - "x % y" means "the smallest thing that's congruent to x
>     modulo y", for some interpretation of "smallest".

Not in Python.  x % y means divmod(x, y)[1] in Python, and divmod(x, y) is a
pair (q, r) such that q*y + r == x and abs(r) < abs(y) (and the strict
inequality there is part of what "smallest" means in Python).

>   - "x == z mod y" means "y divides x-z", which means "x-z
>     is a multiple of y".
>
>   - When y=0, this reduces to "x=z".
>
>   - The smallest -- and indeed the only -- thing that's
>     congruent to x mod 0 is therefore x itself.)

I understand the argument.  Still no chance <wink>.  Forget that it violates
abs(r) < abs(y) whenever abs(x) >= abs(y):  of what *use* is this?  I can't
imagine a real algorithm where a single line

pow(x, y, z)

*sometimes* wants to do a modular pow and sometimes not -- and even if I
could, I can get that now via setting z to None.

python-tries-not-to-hide-probable-errors-ly y'rs  - tim

```