Deutsch English Français Italiano |
<mailman.7.1734298172.2912.python-list@python.org> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!3.eu.feeder.erje.net!feeder.erje.net!fu-berlin.de!uni-berlin.de!not-for-mail From: Oscar Benjamin <oscar.j.benjamin@gmail.com> Newsgroups: comp.lang.python Subject: Re: Division-Bug in decimal and mpmath Date: Sun, 15 Dec 2024 21:29:18 +0000 Lines: 46 Message-ID: <mailman.7.1734298172.2912.python-list@python.org> References: <vjjcnl$3tdnk$1@dont-email.me> <vjjsfu$5jc$1@dont-email.me> <CAHVvXxTyu0BWGjnYHR6eSdvTj+1EQACT67SW2hb-q0Q_MvU-mg@mail.gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Trace: news.uni-berlin.de oXRr7ltFEl+CFRa5gRFigAO3FjY4kMtR6tliWtx/By9A== Cancel-Lock: sha1:BFV8iASQef4p3iEwInQfOBWxJco= sha256:LlwSW2vDksNanqC8Q0kyk2Lv5qLQEA0JWgy5eAvhshc= Return-Path: <oscar.j.benjamin@gmail.com> X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org Authentication-Results: mail.python.org; dkim=pass reason="2048-bit key; unprotected key" header.d=gmail.com header.i=@gmail.com header.b=RSf1loFL; dkim-adsp=pass; dkim-atps=neutral X-Spam-Status: OK 0.009 X-Spam-Evidence: '*H*': 0.98; '*S*': 0.00; 'looks': 0.02; 'calculating': 0.09; 'comparison': 0.09; 'expression': 0.09; 'skip:` 20': 0.09; 'string,': 0.09; 'subject:Bug': 0.09; 'import': 0.15; 'calculations': 0.16; 'decimal': 0.16; 'division': 0.16; 'evaluating': 0.16; 'received:mail-ot1-x331.google.com': 0.16; 'wrote:': 0.16; 'instead': 0.17; 'uses': 0.19; 'to:addr:python- list': 0.20; 'sat,': 0.22; '>>>': 0.28; 'wrong': 0.28; 'dec': 0.31; 'message-id:@mail.gmail.com': 0.31; 'python-list': 0.32; 'but': 0.32; 'mark': 0.32; 'header:In-Reply-To:1': 0.34; 'received:google.com': 0.34; 'from:addr:gmail.com': 0.34; 'running': 0.35; 'final': 0.35; 'errors': 0.36; 'means': 0.38; 'use': 0.39; 'least': 0.39; 'appears': 0.40; 'exact': 0.40; 'martin': 0.40; 'should': 0.40; 'gives': 0.62; 'pass': 0.64; 'six': 0.65; 'below': 0.69; '....': 0.76; 'completeness': 0.84; 'fraction': 0.84; 'oscar': 0.84 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734298169; x=1734902969; darn=python.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=MWMKV+gwoFWTBJX6RB0Z0kw9AGG8OQrKYYCRK7bJo9w=; b=RSf1loFLWA1no2+5kovQR7UonO6WICGcnyq6x0oJve1FRLhr4gESzwTFzM/Cs10qtG G/Ysjr9kOdYdMvvzyFfmZ+0Ep7XSuHYHYwy5EjnhCCYnjjxx8we+uoDS1vPR2lJdIYE+ d3GNgAwLkPHeSP7F9H1Ctvhu0bCWuh2GF/QmW/oY4S9GyLWgIPSrVSPvb4050GSSFubG ehUnnPz+CHyc17sq7Pl7fRdz4g+Vn8LoD4gH1t5nUAcU2KjEa49lE7+9rDxUayimtpqc 4dwzvGxa2IvSBhpe7TRGTEyWHZTFN1VwYT2E5IM2jPdpCX2wLGP9pGiRl6W6N2hsoVR9 iO0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734298169; x=1734902969; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=MWMKV+gwoFWTBJX6RB0Z0kw9AGG8OQrKYYCRK7bJo9w=; b=RR0KZQ2aFbQOZNUahmgC8Qn9+vJXvuZqKCoP3tmVSRh2YncGtZ8/VRt0dijosl2UeE nRHnBWyAX/WifwlHjJTAelDWtCVjTka6Jmds6/xodvQKRcvo/qhIVKGFxkWY+a6iKpVt 8Wa7TMkmtRRQf2Y9mm1ZFP/0SJSlkjD3JaZtkMdEUaG3DWnEG5/Y/Byw4RwKMs8CU86h m2oJHR6gSs0xIOqsLaGe6sQWnxecdhX9aUtngbDdfWjxly8q7ryNFHt26Czv8idT+clF +qQnsdkCe3AHAGyOCKaf0mivMxzkAUTiQCZsdCcp8Hzc3ujA3cpofEDzglw2yAiKVdP4 fltQ== X-Gm-Message-State: AOJu0YyR02DrALuZUQ5IETRS57GBXNj7BQE8CTdsrBdiIceK/Sg2jgos /AZpAXO7X7Mg5b0otkcdEf3h2HJ7i2UzSKhE90v/zqXp2izaYF+YGeGjF1Z6Y8APCOqWD172OFH Ccelt0e7zjhMvy5h6iIdyGFTGpxwI1e8p X-Gm-Gg: ASbGncuk92aR9SctexMx/JvwmzrDPwC3s2nugpKDc2roHnVGW+sPrOxgKTrnTMTpyQ9 MOSlNtOjBbv3UOAGE2KhnGsfrvjKkc2sbKeod2IQuRpBIAsHHkdPym+njWaDPKdNVE6Tw7O1M X-Google-Smtp-Source: AGHT+IEGt0NG2TSmoqJT+shRfLJSMIsvTbJOxYJjEEWGOCt6ZqQxN4MIV1iMF1/U7AwD0cwi3NgHayHghBkjuMa5a30= X-Received: by 2002:a05:6870:1f15:b0:29e:80d8:31a9 with SMTP id 586e51a60fabf-2a3ac491170mr5590928fac.2.1734298169053; Sun, 15 Dec 2024 13:29:29 -0800 (PST) In-Reply-To: <vjjsfu$5jc$1@dont-email.me> X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.39 Precedence: list List-Id: General discussion list for the Python programming language <python-list.python.org> List-Unsubscribe: <https://mail.python.org/mailman/options/python-list>, <mailto:python-list-request@python.org?subject=unsubscribe> List-Archive: <https://mail.python.org/pipermail/python-list/> List-Post: <mailto:python-list@python.org> List-Help: <mailto:python-list-request@python.org?subject=help> List-Subscribe: <https://mail.python.org/mailman/listinfo/python-list>, <mailto:python-list-request@python.org?subject=subscribe> X-Mailman-Original-Message-ID: <CAHVvXxTyu0BWGjnYHR6eSdvTj+1EQACT67SW2hb-q0Q_MvU-mg@mail.gmail.com> X-Mailman-Original-References: <vjjcnl$3tdnk$1@dont-email.me> <vjjsfu$5jc$1@dont-email.me> Bytes: 6250 On Sat, 14 Dec 2024 at 19:02, Mark Bourne via Python-list <python-list@python.org> wrote: > > Martin Ruppert wrote: > > Hi, > > > > the division 0.4/7 provides a wrong result. It should give a periodic > > decimal fraction with at most six digits, but it doesn't. > > > > Below is the comparison of the result of decimal, mpmath, dc and calc. .... > > I looks like you might be running into limitations in floating-point > numbers. At least with decimal, calculating 4/70 instead of 0.4/7 > appears to give the correct result. As does: > ``` > from decimal import Decimal as dec > z2 = dec(4) / dec(10) > print(z2 / dec(nen)) > ``` > You can also pass a string, and `dec("0.4")/dec(10)` gives the correct > result as well. For completeness this is how to do it with mpmath: >>> from mpmath import mp >>> mp.dps = 60 >>> mp.mpf('0.4') / 7 mpf('0.0571428571428571428571428571428571428571428571428571428571428549') You can also use SymPy: >>> from sympy import Rational >>> a = Rational('0.4') / 7 >>> a 2/35 >>> a.evalf(60) 0.0571428571428571428571428571428571428571428571428571428571429 SymPy uses mpmath for evalf but it allows doing exact calculations first and then evaluating the final exact expression to however many digits are desired at the end which means that you don't need to accumulate rounding errors before calling evalf. -- Oscar