From owner-freebsd-hackers@FreeBSD.ORG Sun Jul 11 18:37:29 2004 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C66E516A4CE for ; Sun, 11 Jul 2004 18:37:29 +0000 (GMT) Received: from cruzio.com (dsl3-63-249-85-132.cruzio.com [63.249.85.132]) by mx1.FreeBSD.org (Postfix) with ESMTP id 76F0443D1D for ; Sun, 11 Jul 2004 18:37:29 +0000 (GMT) (envelope-from brucem@mail.cruzio.com) Received: from mail.cruzio.com (localhost [127.0.0.1]) by cruzio.com (8.12.10/8.12.10) with ESMTP id i6BIcHe4000793; Sun, 11 Jul 2004 11:38:17 -0700 (PDT) (envelope-from brucem@mail.cruzio.com) Received: (from brucem@localhost) by mail.cruzio.com (8.12.10/8.12.10/Submit) id i6BIcHku000792; Sun, 11 Jul 2004 11:38:17 -0700 (PDT) (envelope-from brucem) Date: Sun, 11 Jul 2004 11:38:17 -0700 (PDT) From: "Bruce R. Montague" Message-Id: <200407111838.i6BIcHku000792@mail.cruzio.com> To: freebsd-hackers@freebsd.org cc: marck@rinet.ru Subject: Re: gcc strangeness X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Jul 2004 18:37:29 -0000 Hi, re: >one of my friends has raisen very strange issue regarding gcc rounding: > printf("%f %.3f %d\n", a*100, a*100, (int)(a*100)); > > 9.999999 10.000 9 Hasty unresearched guess: If you print with a large fp fmt (say 22.18) you will get a better idea of the value: 9.999999403953552246 10.000 9 The "%.3f" says to round upward to inf after 3 decimal places, so "9.9999" is rounded to "10.000". The "%f" defaults to round up after 6 decimal places, so "9.9999994" is rounded to ""9.999999". Everything is working. There are a lot of subtleties in floating-point printf(). Printing binary values out and reading them back accurately can be a non-trivial exercise. - bruce