473,397 Members | 2,068 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,397 software developers and data experts.

Rounding a floating point number

Hi

"How can I round a number to x decimal places" ?

This question keeps appearing. I would propose the following
solution

#include <float.h>
#include <math.h>

double roundto(double x, int digits)
{
int sgn=1;

if (x == 0)
return 0;
if (digits DBL_DIG)
digits = DBL_DIG;
else if (digits < 1)
digits = 1;

if(x < 0.0) {
sgn = -sgn;
x = -x;
}
double p = floorl(log10l(x));
p--;
p = digits-p;
double pow10 = pow(10.0, p);
return sgn*floor(x*pow10+0.5)/pow10;
}

long double roundtol(long double x, int digits)
{
int sgn=1;

if (x == 0)
return 0;
if (digits LDBL_DIG)
digits = LDBL_DIG;
else if (digits < 1)
digits = 1;

if(x < 0.0) {
sgn = -sgn;
x = -x;
}
long double p = floorl(log10l(x));
p--;
p = digits-p;
long double pow10 = powl(10.0, p);
return sgn*floorl(x*pow10+0.5)/pow10;
}
#include <stdio.h>
int main(void)
{
double d = 1.7888889988996678;
long double ld = 1.7888889988996678998877L;

for (int i = 0; i<=DBL_DIG;i++) {
printf("i=%d: %.15g\n",i,roundto(d,i));
}
printf("\n 1.7888889988996678\n");
for (int i = 0; i<=LDBL_DIG;i++) {
printf("i=%d: %.18Lg\n",i,roundtol(ld,i));
}
printf("\n 1.7888889988996678998877L\n");
return 0;
}

--------------------------------------------------------------------
I would propose it to add it to the FAQ.
--
jacob navia
jacob at jacob point remcomp point fr
logiciels/informatique
http://www.cs.virginia.edu/~lcc-win32
Feb 25 '08 #1
20 4946
jacob navia said:
Hi

"How can I round a number to x decimal places" ?

This question keeps appearing.
<snip>
I would propose it to add it to the FAQ.
Good idea. You could call it Question 14.6.

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
Feb 25 '08 #2

"Richard Heathfield" <rj*@see.sig.invalidwrote in message
news:xc******************************@bt.com...
jacob navia said:
>Hi

"How can I round a number to x decimal places" ?

This question keeps appearing.

<snip>
>I would propose it to add it to the FAQ.

Good idea. You could call it Question 14.6.
14.6 is already used by How to Round a Number [to an integer]

--
Bart
Feb 25 '08 #3
Richard Heathfield wrote:
jacob navia said:
>Hi

"How can I round a number to x decimal places" ?

This question keeps appearing.

<snip>
>I would propose it to add it to the FAQ.

Good idea. You could call it Question 14.6.
Your kill file is not working apparently
:-)

That question addresses the rounding to nearest integer.
This answers the question of rounding to a number of decimal places

Not the same thing. But yes, we could add this to 14.6

--
jacob navia
jacob at jacob point remcomp point fr
logiciels/informatique
http://www.cs.virginia.edu/~lcc-win32
Feb 25 '08 #4
14.6 is already used by How to Round a Number [to an integer]
Then what need is there for this question? Its already answered in the faq.
Multiply, round then divide.
Feb 25 '08 #5
Bartc said:
>
"Richard Heathfield" <rj*@see.sig.invalidwrote in message
news:xc******************************@bt.com...
>jacob navia said:
>>Hi

"How can I round a number to x decimal places" ?

This question keeps appearing.

<snip>
>>I would propose it to add it to the FAQ.

Good idea. You could call it Question 14.6.

14.6 is already used by How to Round a Number [to an integer]
From the FAQ, Q14.6: "You can round to a certain precision by scaling:

(int)(x / precision + 0.5) * precision"

(int)(3.141 / 0.01 + 0.5) * 0.01 gives us:

(int)(314.1 + 0.5) * 0.01 which is

(int)314.6 * 0.01 which is

314 * 0.01 which is

3.14

QED

(Of course, the usual caveats about floating point apply here.)

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
Feb 25 '08 #6
On Mon, 25 Feb 2008 12:19:35 +0100,
jacob navia <ja***@nospam.comwrote:
Richard Heathfield wrote:
>jacob navia said:
>>Hi

"How can I round a number to x decimal places" ?

This question keeps appearing.

<snip>
>>I would propose it to add it to the FAQ.

Good idea. You could call it Question 14.6.
That question addresses the rounding to nearest integer.
This answers the question of rounding to a number of decimal places
It also answers the question of how to round to a certain number of
digits:

\begin{quote}
You can round to a certain precision by scaling:
\end{quote}

Martien
--
|
Martien Verbruggen | prepBut nI vrbLike adjHungarian! qWhat's
| artThe adjBig nProblem? -- Alec Flett
|
Feb 25 '08 #7

"Richard Heathfield" <rj*@see.sig.invalidwrote in message
news:oZ*********************@bt.com...
Bartc said:
>>
"Richard Heathfield" <rj*@see.sig.invalidwrote in message
news:xc******************************@bt.com...
>>jacob navia said:

Hi

"How can I round a number to x decimal places" ?

This question keeps appearing.

<snip>

I would propose it to add it to the FAQ.

Good idea. You could call it Question 14.6.

14.6 is already used by How to Round a Number [to an integer]

From the FAQ, Q14.6: "You can round to a certain precision by scaling:

(int)(x / precision + 0.5) * precision"

(int)(3.141 / 0.01 + 0.5) * 0.01 gives us:

(int)(314.1 + 0.5) * 0.01 which is

(int)314.6 * 0.01 which is

314 * 0.01 which is

3.14
Yeah, you're right. Perhaps 14.6 should be written more clearly, with regard
to what exactly it means by Precision. And an example added, like yours.
>(int)(3.141 / 0.01 + 0.5) * 0.01
Somehow I would be happier if that was written as:
>(int)(3.141 *100 + 0.5) /100
Then any errors due to 0.01 not being exactly 1/100 are someone else's
fault.

--
Bart

Feb 25 '08 #8
MisterE wrote:
>14.6 is already used by How to Round a Number [to an integer]

Then what need is there for this question?
<Fx: swoosh sound of clue going over head>

--
Mark McIntyre

CLC FAQ <http://c-faq.com/>
CLC readme: <http://www.ungerhu.com/jxh/clc.welcome.txt>
Feb 25 '08 #9
On Feb 25, 2:18*am, jacob navia <ja...@nospam.comwrote:
Hi

"How can I round a number to x decimal places" ?

This question keeps appearing. I would propose the following
solution

#include <float.h>
#include <math.h>

double roundto(double x, int digits)
{
* * * * int sgn=1;

* * * * if (x == 0)
* * * * * * * * return 0;
* * * * if (digits DBL_DIG)
* * * * * * * * digits = DBL_DIG;
* * * * else if (digits < 1)
* * * * * * * * digits = 1;

* * * * if(x < 0.0) {
* * * * * * * * sgn = -sgn;
* * * * * * * * x = -x;
* * * * }
* * * * double p = floorl(log10l(x));
* * * * p--;
* * * * p = digits-p;
* * * * double pow10 = pow(10.0, p);
* * * * return sgn*floor(x*pow10+0.5)/pow10;

}

long double roundtol(long double x, int digits)
{
* * * * int sgn=1;

* * * * if (x == 0)
* * * * * * * * return 0;
* * * * if (digits LDBL_DIG)
* * * * * * * * digits = LDBL_DIG;
* * * * else if (digits < 1)
* * * * * * * * digits = 1;

* * * * if(x < 0.0) {
* * * * * * * * sgn = -sgn;
* * * * * * * * x = -x;
* * * * }
* * * * long double p = floorl(log10l(x));
* * * * p--;
* * * * p = digits-p;
* * * * long double pow10 = powl(10.0, p);
* * * * return sgn*floorl(x*pow10+0.5)/pow10;}

#include <stdio.h>
int main(void)
{
* * * * double d = 1.7888889988996678;
* * * * long double ld = 1.7888889988996678998877L;

* * * * for (int i = 0; i<=DBL_DIG;i++) {
* * * * * * * * printf("i=%d: %.15g\n",i,roundto(d,i));
* * * * }
* * * * printf("\n * * *1.7888889988996678\n");
* * * * for (int i = 0; i<=LDBL_DIG;i++) {
* * * * * * * * printf("i=%d: %.18Lg\n",i,roundtol(ld,i));
* * * * }
* * * * printf("\n * * *1.7888889988996678998877L\n");
* * * * return 0;

}

--------------------------------------------------------------------
I would propose it to add it to the FAQ.
This is the snippet's solution (which is very similar to yours):
/* round number n to d decimal points */
double fround(double n, unsigned d)
{
return floor(n * pow(10., d) + .5) / pow(10., d);
}

Of course, no solution is really going to be satisfying, as long as
the output format is floating point.
Another question is "What kind of rounding?" Do we want banker's
rounding or round to nearest or what?
Should we create a round function for each distinct floating point
type?
Feb 25 '08 #10
On Feb 25, 2:18*am, jacob navia <ja...@nospam.comwrote:
Hi

"How can I round a number to x decimal places" ?

This question keeps appearing. I would propose the following
solution

#include <float.h>
#include <math.h>

double roundto(double x, int digits)
{
* * * * int sgn=1;

* * * * if (x == 0)
* * * * * * * * return 0;
* * * * if (digits DBL_DIG)
* * * * * * * * digits = DBL_DIG;
* * * * else if (digits < 1)
* * * * * * * * digits = 1;

* * * * if(x < 0.0) {
* * * * * * * * sgn = -sgn;
* * * * * * * * x = -x;
* * * * }
* * * * double p = floorl(log10l(x));
* * * * p--;
* * * * p = digits-p;
* * * * double pow10 = pow(10.0, p);
* * * * return sgn*floor(x*pow10+0.5)/pow10;

}

long double roundtol(long double x, int digits)
{
* * * * int sgn=1;

* * * * if (x == 0)
* * * * * * * * return 0;
* * * * if (digits LDBL_DIG)
* * * * * * * * digits = LDBL_DIG;
* * * * else if (digits < 1)
* * * * * * * * digits = 1;

* * * * if(x < 0.0) {
* * * * * * * * sgn = -sgn;
* * * * * * * * x = -x;
* * * * }
* * * * long double p = floorl(log10l(x));
* * * * p--;
* * * * p = digits-p;
* * * * long double pow10 = powl(10.0, p);
* * * * return sgn*floorl(x*pow10+0.5)/pow10;}

#include <stdio.h>
int main(void)
{
* * * * double d = 1.7888889988996678;
* * * * long double ld = 1.7888889988996678998877L;

* * * * for (int i = 0; i<=DBL_DIG;i++) {
* * * * * * * * printf("i=%d: %.15g\n",i,roundto(d,i));
* * * * }
* * * * printf("\n * * *1.7888889988996678\n");
* * * * for (int i = 0; i<=LDBL_DIG;i++) {
* * * * * * * * printf("i=%d: %.18Lg\n",i,roundtol(ld,i));
* * * * }
* * * * printf("\n * * *1.7888889988996678998877L\n");
* * * * return 0;

}

--------------------------------------------------------------------
I would propose it to add it to the FAQ.
The snippets solution, tweaked a little bit:

#include <math.h>
/* round number n to d decimal points */
long double roundl(const long double n, const unsigned d)
{
long double p = powl(10., d);
return floorl(n * p + .5) / p;
}

/* round number n to d decimal points */
double roundd(const double n, const unsigned d)
{
return (double) roundl((long double) n, d);
}

/* round number n to d decimal points */
double roundf(const float n, const unsigned d)
{
return (float) roundl((long double) n, d);
}
#ifdef UNIT_TEST
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
int main(void)
{
long double pi = 3.1415926535897932384626433832795;
long double npi = -pi;
unsigned digits;
for (digits = 0; digits <= LDBL_DIG; digits++) {
printf("Rounding by printf gives: %20.*f\n",
digits, pi);
printf("Rounding approximation by function gives: %20.*f\n",
LDBL_DIG, roundl(pi, digits));
printf("Rounding approximation by function gives: %20.*f\n",
DBL_DIG, roundd(pi, digits));
printf("Rounding approximation by function gives: %20.*f\n\n",
FLT_DIG, roundf(pi, digits));
}
for (digits = 0; digits <= LDBL_DIG; digits++) {
printf("Rounding by printf gives: %20.*f\n",
digits, npi);
printf("Rounding approximation by function gives: %20.*f\n",
LDBL_DIG, roundl(npi, digits));
printf("Rounding approximation by function gives: %20.*f\n",
DBL_DIG, roundd(npi, digits));
printf("Rounding approximation by function gives: %20.*f\n\n",
FLT_DIG, roundf(npi, digits));
}
return 0;
}
#endif
/*
Rounding by printf gives: 3
Rounding approximation by function gives: 3.000000000000000
Rounding approximation by function gives: 3.000000000000000
Rounding approximation by function gives: 3.000000

Rounding by printf gives: 3.1
Rounding approximation by function gives: 3.100000000000000
Rounding approximation by function gives: 3.100000000000000
Rounding approximation by function gives: 3.100000

Rounding by printf gives: 3.14
Rounding approximation by function gives: 3.140000000000000
Rounding approximation by function gives: 3.140000000000000
Rounding approximation by function gives: 3.140000

Rounding by printf gives: 3.142
Rounding approximation by function gives: 3.142000000000000
Rounding approximation by function gives: 3.142000000000000
Rounding approximation by function gives: 3.142000

Rounding by printf gives: 3.1416
Rounding approximation by function gives: 3.141600000000000
Rounding approximation by function gives: 3.141600000000000
Rounding approximation by function gives: 3.141600

Rounding by printf gives: 3.14159
Rounding approximation by function gives: 3.141590000000000
Rounding approximation by function gives: 3.141590000000000
Rounding approximation by function gives: 3.141590

Rounding by printf gives: 3.141593
Rounding approximation by function gives: 3.141593000000000
Rounding approximation by function gives: 3.141593000000000
Rounding approximation by function gives: 3.141593

Rounding by printf gives: 3.1415927
Rounding approximation by function gives: 3.141592700000000
Rounding approximation by function gives: 3.141592700000000
Rounding approximation by function gives: 3.141593

Rounding by printf gives: 3.14159265
Rounding approximation by function gives: 3.141592650000000
Rounding approximation by function gives: 3.141592650000000
Rounding approximation by function gives: 3.141593

Rounding by printf gives: 3.141592654
Rounding approximation by function gives: 3.141592654000000
Rounding approximation by function gives: 3.141592654000000
Rounding approximation by function gives: 3.141593

Rounding by printf gives: 3.1415926536
Rounding approximation by function gives: 3.141592653600000
Rounding approximation by function gives: 3.141592653600000
Rounding approximation by function gives: 3.141593

Rounding by printf gives: 3.14159265359
Rounding approximation by function gives: 3.141592653590000
Rounding approximation by function gives: 3.141592653590000
Rounding approximation by function gives: 3.141593

Rounding by printf gives: 3.141592653590
Rounding approximation by function gives: 3.141592653590000
Rounding approximation by function gives: 3.141592653590000
Rounding approximation by function gives: 3.141593

Rounding by printf gives: 3.1415926535898
Rounding approximation by function gives: 3.141592653589800
Rounding approximation by function gives: 3.141592653589800
Rounding approximation by function gives: 3.141593

Rounding by printf gives: 3.14159265358979
Rounding approximation by function gives: 3.141592653589790
Rounding approximation by function gives: 3.141592653589790
Rounding approximation by function gives: 3.141593

Rounding by printf gives: 3.141592653589793
Rounding approximation by function gives: 3.141592653589793
Rounding approximation by function gives: 3.141592653589793
Rounding approximation by function gives: 3.141593

Rounding by printf gives: -3
Rounding approximation by function gives: -3.000000000000000
Rounding approximation by function gives: -3.000000000000000
Rounding approximation by function gives: -3.000000

Rounding by printf gives: -3.1
Rounding approximation by function gives: -3.100000000000000
Rounding approximation by function gives: -3.100000000000000
Rounding approximation by function gives: -3.100000

Rounding by printf gives: -3.14
Rounding approximation by function gives: -3.140000000000000
Rounding approximation by function gives: -3.140000000000000
Rounding approximation by function gives: -3.140000

Rounding by printf gives: -3.142
Rounding approximation by function gives: -3.142000000000000
Rounding approximation by function gives: -3.142000000000000
Rounding approximation by function gives: -3.142000

Rounding by printf gives: -3.1416
Rounding approximation by function gives: -3.141600000000000
Rounding approximation by function gives: -3.141600000000000
Rounding approximation by function gives: -3.141600

Rounding by printf gives: -3.14159
Rounding approximation by function gives: -3.141590000000000
Rounding approximation by function gives: -3.141590000000000
Rounding approximation by function gives: -3.141590

Rounding by printf gives: -3.141593
Rounding approximation by function gives: -3.141593000000000
Rounding approximation by function gives: -3.141593000000000
Rounding approximation by function gives: -3.141593

Rounding by printf gives: -3.1415927
Rounding approximation by function gives: -3.141592700000000
Rounding approximation by function gives: -3.141592700000000
Rounding approximation by function gives: -3.141593

Rounding by printf gives: -3.14159265
Rounding approximation by function gives: -3.141592650000000
Rounding approximation by function gives: -3.141592650000000
Rounding approximation by function gives: -3.141593

Rounding by printf gives: -3.141592654
Rounding approximation by function gives: -3.141592654000000
Rounding approximation by function gives: -3.141592654000000
Rounding approximation by function gives: -3.141593

Rounding by printf gives: -3.1415926536
Rounding approximation by function gives: -3.141592653600000
Rounding approximation by function gives: -3.141592653600000
Rounding approximation by function gives: -3.141593

Rounding by printf gives: -3.14159265359
Rounding approximation by function gives: -3.141592653590000
Rounding approximation by function gives: -3.141592653590000
Rounding approximation by function gives: -3.141593

Rounding by printf gives: -3.141592653590
Rounding approximation by function gives: -3.141592653590000
Rounding approximation by function gives: -3.141592653590000
Rounding approximation by function gives: -3.141593

Rounding by printf gives: -3.1415926535898
Rounding approximation by function gives: -3.141592653589800
Rounding approximation by function gives: -3.141592653589800
Rounding approximation by function gives: -3.141593

Rounding by printf gives: -3.14159265358979
Rounding approximation by function gives: -3.141592653589790
Rounding approximation by function gives: -3.141592653589790
Rounding approximation by function gives: -3.141593

Rounding by printf gives: -3.141592653589793
Rounding approximation by function gives: -3.141592653589793
Rounding approximation by function gives: -3.141592653589793
Rounding approximation by function gives: -3.141593
*/
Feb 25 '08 #11
jacob navia wrote:
>
"How can I round a number to x decimal places" ?

This question keeps appearing. I would propose the following
.... snip 75 or so lines ...

Why all this gyration? I found the following in the c standard:

7.12.9.6 The round functions
Synopsis
[#1]
#include <math.h>
double round(double x);
float roundf(float x);
long double roundl(long double x);

Description

[#2] The round functions round their argument to the nearest
integer value in floating-point format, rounding halfway
cases away from zero, regardless of the current rounding
direction.

Returns

[#3] The round functions return the rounded integer value.

--
[mail]: Chuck F (cbfalconer at maineline dot net)
[page]: <http://cbfalconer.home.att.net>
Try the download section.

--
Posted via a free Usenet account from http://www.teranews.com

Feb 25 '08 #12
CBFalconer <cb********@yahoo.comwrites:
jacob navia wrote:
>>
"How can I round a number to x decimal places" ?

This question keeps appearing. I would propose the following
... snip 75 or so lines ...

Why all this gyration? I found the following in the c standard:

7.12.9.6 The round functions
Those functions are new in C99.
--
char a[]="\n .CJacehknorstu";int putchar(int);int main(void){unsigned long b[]
={0x67dffdff,0x9aa9aa6a,0xa77ffda9,0x7da6aa6a,0xa6 7f6aaa,0xaa9aa9f6,0x11f6},*p
=b,i=24;for(;p+=!*p;*p/=4)switch(0[p]&3)case 0:{return 0;for(p--;i--;i--)case+
2:{i++;if(i)break;else default:continue;if(0)case 1:putchar(a[i&15]);break;}}}
Feb 26 '08 #13
On Feb 25, 4:29*pm, Ben Pfaff <b...@cs.stanford.eduwrote:
CBFalconer <cbfalco...@yahoo.comwrites:
jacob navia wrote:
"How can I round a number to x decimal places" ?
This question keeps appearing. I would propose the following
... snip 75 or so lines ...
Why all this gyration? *I found the following in the c standard:
* 7.12.9.6 *The round functions

Those functions are new in C99.
And they don't round to x decimal places, unless x happens to be
zero. (Admittedly, you could manually scale it.)

Feb 26 '08 #14
Ben Pfaff <bl*@cs.stanford.eduwrites:
CBFalconer <cb********@yahoo.comwrites:
>jacob navia wrote:
>>"How can I round a number to x decimal places" ?

This question keeps appearing. I would propose the following
... snip 75 or so lines ...

Why all this gyration? I found the following in the c standard:

7.12.9.6 The round functions

Those functions are new in C99.
So are floorl and log10l, which jacob's code uses; it also mixes
declarations and statements within a block. An implementation that
can handle jacob's code should provide the round functions.

--
Keith Thompson (The_Other_Keith) <ks***@mib.org>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Feb 26 '08 #15
On Feb 25, 10:15*pm, Keith Thompson <ks...@mib.orgwrote:
Ben Pfaff <b...@cs.stanford.eduwrites:
CBFalconer <cbfalco...@yahoo.comwrites:
jacob navia wrote:
"How can I round a number to x decimal places" ?
>This question keeps appearing. I would propose the following
... snip 75 or so lines ...
Why all this gyration? *I found the following in the c standard:
* 7.12.9.6 *The round functions
Those functions are new in C99.

So are floorl and log10l, which jacob's code uses; it also mixes
declarations and statements within a block. *An implementation that
can handle jacob's code should provide the round functions.
You will still have to multiply and divide by powers of 10 and use
floor() to achieve the same thing because the C99 round() functions
round to nearest integer. They do not round to nearest k decimal
places.
Feb 26 '08 #16
user923005 wrote:
>
.... snip float rounding discussion ...
>
You will still have to multiply and divide by powers of 10 and use
floor() to achieve the same thing because the C99 round() functions
round to nearest integer. They do not round to nearest k decimal
places.
Are you claiming that such multiplication and division by 10 is too
complex for the average reader of c.l.c? :-)

--
[mail]: Chuck F (cbfalconer at maineline dot net)
[page]: <http://cbfalconer.home.att.net>
Try the download section.

--
Posted via a free Usenet account from http://www.teranews.com

Feb 27 '08 #17
On Feb 26, 2:24*pm, CBFalconer <cbfalco...@yahoo.comwrote:
user923005 wrote:

... snip float rounding discussion ...
You will still have to multiply and divide by powers of 10 and use
floor() to achieve the same thing because the C99 round() functions
round to nearest integer. *They do not round to nearest k decimal
places.

Are you claiming that such multiplication and division by 10 is too
complex for the average reader of c.l.c? *:-)
No, but I am claiming that using the C99 functions to round to N
digits will take twice as much work as a function that does it
directly, since the multiplication and division by a power of ten and
the floor function are all that is necessary in either case. And so
while you can round to N digits using the C99 rounding functions, it
really does not make a lot of sense to do it that way.
Feb 27 '08 #18
user923005 wrote:
CBFalconer <cbfalco...@yahoo.comwrote:
>user923005 wrote:

... snip float rounding discussion ...
>>You will still have to multiply and divide by powers of 10 and
use floor() to achieve the same thing because the C99 round()
functions round to nearest integer. They do not round to
nearest k decimal places.

Are you claiming that such multiplication and division by 10 is
too complex for the average reader of c.l.c? :-)

No, but I am claiming that using the C99 functions to round to N
digits will take twice as much work as a function that does it
directly, since the multiplication and division by a power of
ten and the floor function are all that is necessary in either
case. And so while you can round to N digits using the C99
rounding functions, it really does not make a lot of sense to do
it that way.
Let me also point out that such rounding is rarely needed. Most of
the time maintaining the original alleged precision and rounding
only the output, via printf, is needed.

--
[mail]: Chuck F (cbfalconer at maineline dot net)
[page]: <http://cbfalconer.home.att.net>
Try the download section.

--
Posted via a free Usenet account from http://www.teranews.com

Feb 27 '08 #19
On Feb 27, 8:10*am, CBFalconer <cbfalco...@yahoo.comwrote:
user923005 wrote:
CBFalconer <cbfalco...@yahoo.comwrote:
user923005 wrote:
... snip float rounding discussion ...
>You will still have to multiply and divide by powers of 10 and
use floor() to achieve the same thing because the C99 round()
functions round to nearest integer. *They do not round to
nearest k decimal places.
Are you claiming that such multiplication and division by 10 is
too complex for the average reader of c.l.c? *:-)
No, but I am claiming that using the C99 functions to round to N
digits will take twice as much work as a function that does it
directly, since the multiplication and division by a power of
ten and the floor function are all that is necessary in either
case. *And so while you can round to N digits using the C99
rounding functions, it really does not make a lot of sense to do
it that way.

Let me also point out that such rounding is rarely needed. *Most of
the time maintaining the original alleged precision and rounding
only the output, via printf, is needed.
I would go one step further:
It's better than rounding the original data.
But sometimes people want to do it anyway.
Feb 28 '08 #20

"CBFalconer" <cb********@yahoo.comwrote in message
news:47**************@yahoo.com...
user923005 wrote:
>CBFalconer <cbfalco...@yahoo.comwrote:
>>user923005 wrote:

... snip float rounding discussion ...

You will still have to multiply and divide by powers of 10 and
use floor() to achieve the same thing because the C99 round()
functions round to nearest integer. They do not round to
nearest k decimal places.

Are you claiming that such multiplication and division by 10 is
too complex for the average reader of c.l.c? :-)

No, but I am claiming that using the C99 functions to round to N
digits will take twice as much work as a function that does it
directly, since the multiplication and division by a power of
ten and the floor function are all that is necessary in either
case. And so while you can round to N digits using the C99
rounding functions, it really does not make a lot of sense to do
it that way.

Let me also point out that such rounding is rarely needed. Most of
the time maintaining the original alleged precision and rounding
only the output, via printf, is needed.
There was a long discussion about this stuff last November in c.l.c with
various examples of why such rounding can be useful. One example was
cleaning noisy data.

--
Bart

Feb 28 '08 #21

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

20
by: Raoul Watson | last post by:
By any chance, anyone got a rounding routine that does a work around the VB "round" bug? I still find it amazing that a company as large as Microsoft would put out a math package that is so...
6
by: Curley Q. | last post by:
Is there a std lib rounding function that will round a real to a given number of decimal places? Something like: double round_it(double number, int decimal_digits) pass 34.5678, 3 to it and it...
13
by: kennethlou | last post by:
Hi, If in C a variable appears like X=10.000000, I can round it to zero decimal places. ie X=10? I then have to save the number into a variable. The method appears below:...
29
by: Marco | last post by:
Hello, I have : float f = 36.09999999; When I do : char cf; sprintf(cf,"%0.03lf", f); I get : 36.100
15
by: Mukesh_Singh_Nick | last post by:
Why does floating point have a rounding error? How to work around it? For example, the following: flaot f = 1234.12345678F; printf("%2f\n", f) //prints 1234.123413 and
206
by: md | last post by:
Hi Does any body know, how to round a double value with a specific number of digits after the decimal points? A function like this: RoundMyDouble (double &value, short numberOfPrecisions) ...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.