From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS4713 221.184.0.0/13 X-Spam-Status: No, score=-4.1 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by dcvr.yhbt.net (Postfix) with ESMTP id 8D1E21F453 for ; Tue, 30 Apr 2019 08:16:57 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 53261120A2C; Tue, 30 Apr 2019 17:16:51 +0900 (JST) Received: from o1678948x4.outbound-mail.sendgrid.net (o1678948x4.outbound-mail.sendgrid.net [167.89.48.4]) by neon.ruby-lang.org (Postfix) with ESMTPS id 3D28112091B for ; Tue, 30 Apr 2019 17:16:49 +0900 (JST) Received: by filter0144p3mdw1.sendgrid.net with SMTP id filter0144p3mdw1-1965-5CC80471-13 2019-04-30 08:16:49.568796392 +0000 UTC m=+388556.106103224 Received: from herokuapp.com (unknown [3.86.82.84]) by ismtpd0006p1iad2.sendgrid.net (SG) with ESMTP id h4HZi2TXSBuCIubxd6ymPg for ; Tue, 30 Apr 2019 08:16:49.411 +0000 (UTC) Date: Tue, 30 Apr 2019 08:16:49 +0000 (UTC) From: duerst@it.aoyama.ac.jp Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 67972 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 15811 X-Redmine-Issue-Author: yennguyenh X-Redmine-Sender: duerst X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: =?us-ascii?Q?uQY=2F2xNrNfHHTWbKn6MBvvzfU5Pqk9I4lnOVb0CFDuvbxmJltBk=2F0FNs2GKhCn?= =?us-ascii?Q?pkgad2XoLO1BRhuYBsTOzwIivpzGf5XoH=2FFgtQB?= =?us-ascii?Q?UI3wfBfkqTeQikpm4+bLfjuBBkMy5CovVas1GQU?= =?us-ascii?Q?6lv56udG0bcZS63RhIGBU6f+pKlrpKDLkkWee=2F1?= =?us-ascii?Q?IiMX=2FmklFZ1zit=2FMKaiXEIg47ivHqWrk9DQ=3D=3D?= To: ruby-core@ruby-lang.org X-ML-Name: ruby-core X-Mail-Count: 92489 Subject: [ruby-core:92489] [Ruby trunk Feature#15811] Propsing new method for comparing equality of 2 (float) numbers relatively X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #15811 has been updated by duerst (Martin D=FCrst). Ruby is an object-oriented language. So I think this should be something li= ke: ``` a.close_to?(b, abs_tolerance: t) ``` or so, not a function with two main numbers. ---------------------------------------- Feature #15811: Propsing new method for comparing equality of 2 (float) num= bers relatively https://bugs.ruby-lang.org/issues/15811#change-77834 * Author: yennguyenh (yen nguyen) * Status: Open * Priority: Normal * Assignee: = * Target version: = ---------------------------------------- # Background Equal comparison method between 2 float numbers returns unexpected results = sometimes. Therefore, a relative comparison method is needed! # Proposal A relative equal comparison method has been written based on a Python proje= ct! This method gives the approximation for the equal comparison based on t= wo values: realative tolerance and absolute tolerance. Near zero value will= also be considered carefully! # Implementation The function for that would be called close? `close?(a, b, rel_tol, abs_tol)` `a` and `b`: are the two values to be tested to relative closeness `rel_tol`: is the relative tolerance -- it is the amount of error allowed, = relative to the larger absolute value of a or b. For example, to set a tole= rance of 5%, pass tol=3D0.05. The default tolerance is 1E-9, which assures = that the two values are the same within about 9 decimal digits. rel_tol mus= t be greater than 0.0 `abs_tol`: is a minimum absolute tolerance level -- useful for comparisons = near zero. # Evaluation of your implementation By default, relative tolerance is 1E-9 which is relatively precise enough t= o compare two float numbers. However it can also be adjusted in case higher= accuracy is requested. The absolute tolerance is by default 0.0 and need t= o be set in case of near-zero numbers. # Discussion There are some test cases available for the method which has approved the a= ccuracy of the method. BigNumbers and integers are also tested. However, mo= re test cases are still needed to assure even better the accuracy of the me= thod. # Gist = Relative equal comparison https://gist.github.com/yennguyenh/63d5e7a11f354f796b43ada037c4b2c5 Test cases https://gist.github.com/yennguyenh/2e81dc72b310cb9d886a82faf3d536ef -- = https://bugs.ruby-lang.org/ Unsubscribe: