Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Rounding Float in C and Remove those Zeros

Reply
Thread Tools

Rounding Float in C and Remove those Zeros

 
 
kennethlou@yahoo.com.hk
Guest
Posts: n/a
 
      05-12-2006
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:
**************************************
>printf("Round % .f \n", 10.0000000);


and the result will appear on the screen as "10"

is there any method to "save" the rounded value as X?

Thanks,

 
Reply With Quote
 
 
 
 
Vladimir Oka
Guest
Posts: n/a
 
      05-12-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> Hi,


Hi!

> If in C a variable appears like X=10.000000, I can round it to zero
> decimal places. ie X=10?


Er, yes... maybe. But you don't say what `X` is: an `int`, a `double`?
What exactly do you want to achieve?

> I then have to save the number into a variable.


What variable?

> The method appears below:
> **************************************
> >printf("Round % .f \n", 10.0000000);


This is not "saving a number into a variable".

> and the result will appear on the screen as "10"


Yes (not necessarily on the "screen", though).

> is there any method to "save" the rounded value as X?


Yes, but you'll have to be more specific about what exactly you want to
do.

 
Reply With Quote
 
 
 
 
Vladimir Oka
Guest
Posts: n/a
 
      05-12-2006
Vladimir Oka opined:

> (E-Mail Removed) wrote:
>> Hi,

>
> Hi!
>
>> If in C a variable appears like X=10.000000, I can round it to zero
>> decimal places. ie X=10?

>
> Er, yes... maybe. But you don't say what `X` is: an `int`, a
> `double`? What exactly do you want to achieve?
>
>> I then have to save the number into a variable.

>
> What variable?
>
>> The method appears below:
>> **************************************
>> >printf("Round % .f \n", 10.0000000);

>
> This is not "saving a number into a variable".
>
>> and the result will appear on the screen as "10"

>
> Yes (not necessarily on the "screen", though).
>
>> is there any method to "save" the rounded value as X?

>
> Yes, but you'll have to be more specific about what exactly you want
> to do.


I have also received this reply from Ken:

> > Hi,
> >
> > Thanks for your reply to my post in Google Groups.
> >
> > So I have a prrogram as follows:
> >
> > *************************
> > Float X;(which X is a float)
> > int Y;(which Y is an integer).
> >
> > X = 10.0000;
> >
> > what can I do so that I can transform 10.0000 into 10
> > and assign Y = 10?


Firstly, it is considered polite to keep all topical discussions
public. Many people don't even publish their (correct) e-mail
addresses.

In response to your question, to assign 10 to `Y`, you can do either
of:

Y = 10; /* facetious */

or

X = 10.0000;
Y = X;

In the latter, `Y` will indeed be 10 only if 10 is exactly
representable as a floating point number on your implementation. I
think (before looking into the Standard) that all small integers are
guaranteed to be. Beware numbers like 1000000000000042.0000, though.

--
Persistence in one opinion has never been considered
a merit in political leaders.
-- Marcus Tullius Cicero, "Ad familiares", 1st century BC

<http://clc-wiki.net/wiki/Introduction_to_comp.lang.c>

 
Reply With Quote
 
osmium
Guest
Posts: n/a
 
      05-12-2006
"Vladimir Oka" writes:

> I > think (before looking into the Standard) that all small integers are
> guaranteed to be. Beware numbers like 1000000000000042.0000, though.


No. For example, the number 1 can not be represented exactly. Select as
many terms as you wish from the following series:
1/2, 1/4, 1/8, ....1/2^googolplex

No way are you going to get a 1 out of that. People who write I/O libraries
are aware of this and create the *illusion* that you can.


 
Reply With Quote
 
Vladimir Oka
Guest
Posts: n/a
 
      05-12-2006
osmium opined:

> "Vladimir Oka" writes:
>
>> I > think (before looking into the Standard) that all small integers
>> are guaranteed to be. Beware numbers like 1000000000000042.0000,
>> though.

>
> No. For example, the number 1 can not be represented exactly. Select
> as many terms as you wish from the following series:
> 1/2, 1/4, 1/8, ....1/2^googolplex
>
> No way are you going to get a 1 out of that. People who write I/O
> libraries are aware of this and create the *illusion* that you can.


Hmmm. A quick look into the Standard, and some searching through past
c.l.c posts seem to justify my statement that certain range of
integers is indeed exactly representable in floating point types.

Look at the <float.h>. It defines FLT_DIG, DBL_DIG and LDBL_DIG as
the number of decimal digits of precision in a `float`, `double` and
`long double`, respectively. Integers with less than this number of
digits should be exactly representable in the appropriate floating
point types.

I can't say much (anything?) about how this is exactly achieved,
though.

--
Too much of anything, even love, isn't necessarily a good thing.
-- Kirk, "The Trouble with Tribbles", stardate 4525.6

<http://clc-wiki.net/wiki/Introduction_to_comp.lang.c>

 
Reply With Quote
 
Skarmander
Guest
Posts: n/a
 
      05-12-2006
osmium wrote:
> "Vladimir Oka" writes:
>
>> I think (before looking into the Standard) that all small integers are
>> guaranteed to be. Beware numbers like 1000000000000042.0000, though.

>
> No. For example, the number 1 can not be represented exactly.


You've happened to pick a number that's exactly representable in all
floating-point systems: 1.0 = 1 * b^0 for any valid base b.

> Select as many terms as you wish from the following series:
> 1/2, 1/4, 1/8, ....1/2^googolplex
>
> No way are you going to get a 1 out of that. People who write I/O libraries
> are aware of this and create the *illusion* that you can.
>

This illusion is called rounding, and it's not really I/O specific. It
depends on the number of digits you ask for, and are able to get.

Had you said 0.1, you might have had a point, as this number is not exactly
representable in binary floating point. On the other hand, implementations
need not use base 2; 0.1 *is* exactly representable in base 10.

You may wish to verify that "all small integers" are indeed exactly
representable in every floating-point system. All integers from -(b^p)
through b^p, with b the base and p the precision, are exactly representable.
For b = 2 and p = 24 (an IEEE 754 single-precision float), all integers
from -16777216 through 16777216 are exactly representable. For double
precision, all integers from -(2^53) through 2^53 are exactly representable.

At this point I'm obliged to refer to the classic: "What Every Computer
Scientist Should Know About Floating-Point Arithmetic", available at, for
example,
http://www.physics.ohio-state.edu/~d...point_math.pdf

S.
 
Reply With Quote
 
Dik T. Winter
Guest
Posts: n/a
 
      05-12-2006
In article <(E-Mail Removed)> "osmium" <(E-Mail Removed)> writes:
> No. For example, the number 1 can not be represented exactly. Select as
> many terms as you wish from the following series:
> 1/2, 1/4, 1/8, ....1/2^googolplex


You clearly have no idea how floating point works.
--
dik t. winter, cwi, kruislaan 413, 1098 sj amsterdam, nederland, +31205924131
home: bovenover 215, 1025 jn amsterdam, nederland; http://www.cwi.nl/~dik/
 
Reply With Quote
 
Malcolm
Guest
Posts: n/a
 
      05-13-2006
"Vladimir Oka" <(E-Mail Removed)> wrote
>
> Look at the <float.h>. It defines FLT_DIG, DBL_DIG and LDBL_DIG as
> the number of decimal digits of precision in a `float`, `double` and
> `long double`, respectively. Integers with less than this number of
> digits should be exactly representable in the appropriate floating
> point types.
>
> I can't say much (anything?) about how this is exactly achieved,
> though.
>

Imagine that you are allowed to represent floating point digits in ASCII
using only six digits.

So a half is no problem. That's "0.5". A small whole number is also no
problem, that's "100" and so forth.
A third is a bit of a snag. We can write "0.3333" which is good enough for
most purposes, but not exact.
Also if we want very large numbers, we run out of digits. However we can go
to scientific notation. So 1234567890 would be "1.23e9". We've lost the low
digits, but we're still accurate to 3 significant figures.

Computer floating point works in a very similar way, except that the digits
are binary rather than decimal, and there isn't a literal point character -
the point is implicit in the scientific style of notation.
--
Website: www.personal.leeds.ac.uk/~bgy1mm





 
Reply With Quote
 
Joe Wright
Guest
Posts: n/a
 
      05-15-2006
osmium wrote:
> "Vladimir Oka" writes:
>
>> I > think (before looking into the Standard) that all small integers are
>> guaranteed to be. Beware numbers like 1000000000000042.0000, though.

>
> No. For example, the number 1 can not be represented exactly. Select as
> many terms as you wish from the following series:
> 1/2, 1/4, 1/8, ....1/2^googolplex
>
> No way are you going to get a 1 out of that. People who write I/O libraries
> are aware of this and create the *illusion* that you can.
>
>

You misunderstand the floating point system. In IEEE 754 integers up to
the width of the mantissa are represented exactly. On my system thats
2**24 for float and 2**53 for double.

--
Joe Wright
"Everything should be made as simple as possible, but not simpler."
--- Albert Einstein ---
 
Reply With Quote
 
osmium
Guest
Posts: n/a
 
      05-15-2006
"Joe Wright" writes:

> osmium wrote:


>> No. For example, the number 1 can not be represented exactly. Select as
>> many terms as you wish from the following series:
>> 1/2, 1/4, 1/8, ....1/2^googolplex
>>
>> No way are you going to get a 1 out of that. People who write I/O
>> libraries are aware of this and create the *illusion* that you can.

> You misunderstand the floating point system. In IEEE 754 integers up to
> the width of the mantissa are represented exactly. On my system thats
> 2**24 for float and 2**53 for double.


You're right. I was referring to the floating point representation I
learned in school. Which was not THE floating point system, it was only A
floating point system. Since seeing some of the earlier posts I have looked
into IEEE 754 and it *is* quite different - and an improvement. Bystanders
should be aware, however, that there is no assurance that C uses IEEE 754,
so coders still have to follow the old rules if they want to permit cross
platform use. That is, don't use == if you want portability. The
representation I was speaking about is still permissible.


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
float to string to float, with first float == second float Carsten Fuchs C++ 45 10-08-2009 09:47 AM
getting rid of leading zeros in float expotential tom@finland.com Python 1 06-03-2007 04:42 PM
Rounding values after zeros joshb Javascript 10 07-25-2005 04:28 PM
rounding a float/double to nearest 1/10th Shea Martin C++ 7 10-30-2003 04:51 PM
Re: float->byte->float is same with original float image. why float->ubyte->float is different??? bd C Programming 0 07-07-2003 12:09 AM



Advertisments