From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sourceware.org (Postfix) with ESMTPS id 7BDE8385482F for ; Tue, 4 May 2021 08:08:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7BDE8385482F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=inria.fr Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=Paul.Zimmermann@inria.fr IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AJgSOGKBhFtmhiNrlHekV55DYdL4zR+YMi2QD?= =?us-ascii?q?/UoZc3BoW+afkN2jm+le6A/shF8qKRMdsP2JJaXoexjh3LFv5415B92fdSng/F?= =?us-ascii?q?ClNYRzqbblqgePJwTb1spwkZhtaLJ/DtqYNykYse/f7BOjG9gthPmrmZrGuc7k?= =?us-ascii?q?w31gTR5nZshbhm9EIz2WHUFsSA5NCYBRLvuhz/BarDmtc2l/VKSGL0QFROTKqp?= =?us-ascii?q?nqk5/rcHc9dngawTSOlj+h5frGFQGZ1H4lIlRy6IolmFKpryXJooGqs/S20Xbn?= =?us-ascii?q?pgvuxqUTvsDgxNtFDNGNjcZQCgyEsHfMWLhc?= X-IronPort-AV: E=Sophos;i="5.82,271,1613430000"; d="scan'208";a="380431252" Received: from tomate.loria.fr (HELO tomate) ([152.81.10.51]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 May 2021 10:08:55 +0200 Date: Tue, 04 May 2021 10:08:54 +0200 Message-Id: From: Paul Zimmermann To: newlib@sourceware.org Subject: incorrectly rounded square root X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: newlib@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 May 2021 08:08:58 -0000 Hi, according to IEEE 754, the square root function should be correctly rounded for all rounding modes. I noticed this is not the case in Newlib: $ cat test_sqrt.c #include #include #include #ifdef NEWLIB int errno; int* __errno () { return &errno; } #endif int main() { int rnd[4] = { FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD, FE_DOWNWARD }; char Rnd[4] = "NZUD"; float x = 0x1.ff07fep+127f; float y; for (int i = 0; i < 4; i++) { fesetround (rnd[i]); y = sqrtf (x); printf ("RND%c: %a\n", Rnd[i], y); } } $ gcc -DNEWLIB -fno-builtin test_sqrt.c /localdisk/zimmerma/newlib-4.1.0/libm.a -lm $ ./a.out RNDN: 0x1.ff83fp+63 RNDZ: 0x1.ff83fp+63 RNDU: 0x1.ff83fp+63 RNDD: 0x1.ff83fp+63 The RNDZ and RNDD results are wrong. With glibc I get: $ gcc -fno-builtin test_sqrt.c -lm $ ./a.out RNDN: 0x1.ff83fp+63 RNDZ: 0x1.ff83eep+63 RNDU: 0x1.ff83fp+63 RNDD: 0x1.ff83eep+63 Best regards, Paul Zimmermann