delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2000/06/01/11:46:37

From: buers AT gmx DOT de (Dieter Buerssner)
Newsgroups: comp.os.msdos.djgpp
Subject: Re: Rounding doubles to ints
Date: 1 Jun 2000 15:37:29 GMT
Lines: 38
Message-ID: <8h67e5.3vs4im1.0@buerssner-17104.user.cis.dfn.de>
References: <39363d0a$0$8416$7f31c96c AT news01 DOT syd DOT optusnet DOT com DOT au>
NNTP-Posting-Host: pec-142-121.tnt9.s2.uunet.de (149.225.142.121)
Mime-Version: 1.0
X-Trace: fu-berlin.de 959873849 2510753 149.225.142.121 (16 [17104])
X-Posting-Agent: Hamster/1.3.13.0
User-Agent: Xnews/03.02.04
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Jason wrote:

>Just a quick question - is it standard practice for a c/c++ compiler (such
>as DJGPP) to round up-always, down-always or to the nearest-integer when
>casting a double to an int?

The casting to int will truncate the decimal palces. So

  int i;
  i = 1.9; /* i = 1 */
  i = -1.9; /* i = -1 */

>If there is no standard for rounding with regard to casting doubles to
>ints, would it be best to use floor(), ceil() and round() just in case
>(for cross-compiler compatibility)?

AFAIK, DJGPP does not support the C99 function round(). So, depending on
how you exactly define your rounding problem, you have the possibility
of casting to an int, perhaps something like (int)(x + 0.5) for positive
x. When the range of int is not enough, or you need the result as a
floating point number, you can use floor(x + 0.5). All of this gives
you biased rounding, meaning the x.5 always rounds up. Implementing
unbiased rounding (always round to even for .5 cases: 0.5 -> 0, 1.5 -> 2,
2.5 -> 2, 3.5 -> 4 ...) in portable C is a little bit more work.
If you need this, and are interested in GCC and x86 only, a line
of inline assembler might be the easiest.

/* untested */
double my_round(double x)
{
  double rounded;
  /* assume, nobody played with the FPU rounding flags */
  __asm__ ("frndint" : "=t" (rounded) : "0" (x));
  return rounded;
}

--
Regards, Dieter Buerssner

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019