# [issue16460] Strange results for floor division ("//") with non-integer divisors

```Mark Dickinson added the comment:

> I believe that definining x//y as math.floor(x/y) is also confusing
> in other cases (without being able to construct such cases right away).```
```
In addition, defining x//y as math.floor(x / y) would break its connection with
%:  a key invariant is that

(x // y) * y + x % y should be (approximately in the case of floats) equal
to y.

The connection between // and % is more fundamental than the connection between
// and /, so in cases where the two disagree, the %-related one wins.

For applications:  it's true that they're not common, but they do exist.  One
such is argument reduction:  e.g., for a toy case, suppose that you're
implementing a function that computes and returns sin and cos.  The computation
can be reduced to computing for angles between 0 and pi / 4:

def sincos(x):
""" Compute and return sin(x) and cos(x). """
q, r = divmod(x, pi / 4)
<compute sincos(r)>
<use symmetries and the last 3 bits of q to compute sincos(x)>

This is an example where if the relationship between % and // were broken, we'd
get wrong results---not simply inaccurate, but completely wrong.

It's also worth noting that // and % are special in that they're the only basic
arithmetic operations that can be computed *exactly*, with no numeric error,
for a wide range of inputs:  e.g., if x and y are positive and x / y < 2**53,
then both x // y and x % y return exact results.  Modifying them to return
inexact results instead would be ... surprising.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue16460>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

```