On 2020-10-07 07:53:55 +0200, Marco Sulla wrote: > If you want to avoid float problems, you can use Decimal:
Decimal doesn't avoid floating point problems, because it is a floating point format. For example: Python 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from decimal import * >>> a = Decimal(3) >>> a Decimal('3') >>> b = Decimal(1E50) >>> b Decimal('100000000000000007629769841091887003294964970946560') >>> c = Decimal(2) >>> a + b - c - b Decimal('8112996705035029053440') >>> b - b + a - c Decimal('1') >>> a + (b - b) - c Decimal('1') >>> a + b - b - c Decimal('8112996705035029053438') >>> Mathematically, all four expressions should have the result 1, but with floating point numbers they don't because intermediate results are rounded. For comparison, here are the results with float: >>> a + b - c - b 0.0 >>> b - b + a - c 1.0 >>> a + (b - b) - c 1.0 >>> a + b - b - c -2.0 >>> One could argue that these are at least closer to the truth, although I think that's just luck, Decimal does have two advantages over float: a) It's precision is configurable and even by default higher. So on average, the error is smaller (but still not zero). b) It uses decimal numbers like we learned in school. So it will make the same errors as we make when we use pencil and paper, which is less confusing to laypersons than the seemingly arbitrary errors from converting from decimal to binary and back. The disadvantages are of course higher memory consumption and lower speed. Also, I'm very confident that the engineers at Intel and AMD knew what they were doing when they designed the FP units of their processors. I'm slightly less confident about the authors of the Decimal module. And I'm much less confident that the average Python programmer can implement a matrix multiplication with Decimal which is as numerically stable as what Matlab or Pandas provide using IEEE-754 arithmetic. hp PS: I recently read an interesting article on the Android calculator. That goes to extreme lengths to avoid unexpected rounding errors. It is also very slow, but still faster than a human can look, so it doesn't matter. -- _ | Peter J. Holzer | Story must make more sense than reality. |_|_) | | | | | h...@hjp.at | -- Charles Stross, "Creative writing __/ | http://www.hjp.at/ | challenge!"
signature.asc
Description: PGP signature
-- https://mail.python.org/mailman/listinfo/python-list