Return-Path: X-Original-To: apmail-commons-issues-archive@minotaur.apache.org Delivered-To: apmail-commons-issues-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 4761CDEC0 for ; Fri, 21 Sep 2012 11:07:12 +0000 (UTC) Received: (qmail 52469 invoked by uid 500); 21 Sep 2012 11:07:09 -0000 Delivered-To: apmail-commons-issues-archive@commons.apache.org Received: (qmail 52082 invoked by uid 500); 21 Sep 2012 11:07:08 -0000 Mailing-List: contact issues-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: issues@commons.apache.org Delivered-To: mailing list issues@commons.apache.org Received: (qmail 52006 invoked by uid 99); 21 Sep 2012 11:07:07 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 21 Sep 2012 11:07:07 +0000 Date: Fri, 21 Sep 2012 22:07:07 +1100 (NCT) From: "Gilles (JIRA)" To: issues@commons.apache.org Message-ID: <1368105500.107301.1348225627841.JavaMail.jiratomcat@arcas> In-Reply-To: <186753565.101386.1348128908045.JavaMail.jiratomcat@arcas> Subject: [jira] [Updated] (MATH-866) New method to compute relative deviation between two floating numbers MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/MATH-866?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Gilles updated MATH-866: ------------------------ Description: A new method to compute a relative deviation would be very useful. In order to handle properly odd values (O+,0-,NaN,Infinity), we suggest to call first the classical equals() method (strict equality, using one ulp as a threshold) and then the relative tolerance. Here is the code we use : {noformat} public static boolean equalsWithRelativeTolerance(final double x, final double y, final double eps) { // Initialisation boolean isEqual = false; // very close (including both equals 0.0) case if (equals(x, y)) { isEqual = true; } // common case else { // Relative difference computation final double absoluteMax = FastMath.max(FastMath.abs(x), FastMath.abs(y)); final double relativeDifference = FastMath.abs((x - y) / absoluteMax); //test if (relativeDifference < eps) { isEqual = true; } } return isEqual; } {noformat} was: A new method to compute a relative deviation would be very useful. In order to handle properly odd values (O+,0-,NaN,Infinity), we suggest to call first the classical equals() method (strict equality, using one ulp as a threshold) and then the relative tolerance. Here is the code we use : public static boolean equalsWithRelativeTolerance(final double x, final double y, final double eps) { // Initialisation boolean isEqual = false; // very close (including both equals 0.0) case if (equals(x, y)) { isEqual = true; } // common case else { // Relative difference computation final double absoluteMax = FastMath.max(FastMath.abs(x), FastMath.abs(y)); final double relativeDifference = FastMath.abs((x - y) / absoluteMax); //test if (relativeDifference < eps) { isEqual = true; } } return isEqual; } > New method to compute relative deviation between two floating numbers > --------------------------------------------------------------------- > > Key: MATH-866 > URL: https://issues.apache.org/jira/browse/MATH-866 > Project: Commons Math > Issue Type: Improvement > Affects Versions: 3.1 > Reporter: Yannick TANGUY > Fix For: 3.1 > > > A new method to compute a relative deviation would be very useful. > In order to handle properly odd values (O+,0-,NaN,Infinity), we suggest to call first the classical equals() method (strict equality, using one ulp as a threshold) and then the relative tolerance. > Here is the code we use : > {noformat} > public static boolean equalsWithRelativeTolerance(final double x, final double y, final double eps) { > // Initialisation > boolean isEqual = false; > // very close (including both equals 0.0) case > if (equals(x, y)) { > isEqual = true; > } > // common case > else { > // Relative difference computation > final double absoluteMax = FastMath.max(FastMath.abs(x), FastMath.abs(y)); > final double relativeDifference = FastMath.abs((x - y) / absoluteMax); > //test > if (relativeDifference < eps) { > isEqual = true; > } > } > return isEqual; > } > {noformat} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira