Hi,
yesterday I discovered something that won't come as a surprise to more experienced C++  programmers  but I was genuinely amazed. I had this line of code:
float x = 0.9f;
and when I had a look at it in the VS.NET 2003 debugger, it said x had avalue of 0.89999998 ! When I printf'ed x to a logfile, it was 0.8999999761581 420900000000000 00. Now, why on earth is that? I understand that the results of floatingpoint operations will always be somewhat imprecise due to machine limitations, but 0.9? Can anybody explain this to me? 13 5356
Sebastian wrote: Hi,
yesterday I discovered something that won't come as a surprise to more experienced C++  programmers  but I was genuinely amazed. I had this line of code:
float x = 0.9f;
and when I had a look at it in the VS.NET 2003 debugger, it said x had a value of 0.89999998 ! When I printf'ed x to a logfile, it was 0.8999999761581 420900000000000 00. Now, why on earth is that? I understand that the results of floatingpoint operations will always be somewhat imprecise due to machine limitations, but 0.9? Can anybody explain this to me?
IEEE754, which is the floating point representation used on most
platforms that I am aware of, is a base two encoding for floating point
values. Just as base 10 has irrational fractions (somewhat like 1/3)
so does base two. The adventure here is that the fractions that are
irrational in base two are different from those that are irrational in
base 10. Apparently 9/10 is one of those irrational fractions in base
2.
Regards,
Jon Trauntvein
Sebastian wrote: Hi,
yesterday I discovered something that won't come as a surprise to more experienced C++  programmers  but I was genuinely amazed. I had this line of code:
float x = 0.9f;
and when I had a look at it in the VS.NET 2003 debugger, it said x had a value of 0.89999998 ! When I printf'ed x to a logfile, it was 0.8999999761581 420900000000000 00. Now, why on earth is that? I understand that the results of floatingpoint operations will always be somewhat imprecise due to machine limitations, but 0.9? Can anybody explain this to me?
Floating point numbers approximate a continuous range of numbers. Since that
range has an infinite count of different numbers, it isn't possible to
store every number exactly in a computer.
Remember that computers are not calculating in base 10 as humans usually
are, but in base 2. So a number that might look simple to us (like 0.9) can
in base 2 have an infinite number of digits, and thus be impossible to
store exactly in a base 2 floating point number.
Wow. Thanks for the speedy answer. I like this  the idea that there would be irrational numbers in the binary system never crossed my mind, butit sounds absolutely logical. :)
On 7 May 2005 05:21:19 0700, JH Trauntvein <j.**********@c omcast.net> wrote: Sebastian wrote: Hi,
yesterday I discovered something that won't come as a surprise to more experienced C++  programmers  but I was genuinely amazed. I had this line of code:
float x = 0.9f;
and when I had a look at it in the VS.NET 2003 debugger, it said x had a value of 0.89999998 ! When I printf'ed x to a logfile, it was 0.8999999761581 420900000000000 00. Now, why on earth is that? I understand that the results of floatingpoint operations will always be somewhat imprecise due to machine limitations, but 0.9? Can anybody explain this to me?
IEEE754, which is the floating point representation used on most platforms that I am aware of, is a base two encoding for floating point values. Just as base 10 has irrational fractions (somewhat like 1/3) so does base two. The adventure here is that the fractions that are irrational in base two are different from those that are irrational in base 10. Apparently 9/10 is one of those irrational fractions in base 2.
Regards,
Jon Trauntvein

Regards,
Sebastian
In article <11************ *********@z14g2 000cwz.googlegr oups.com>,
"JH Trauntvein" <j.**********@c omcast.net> writes: Sebastian wrote: yesterday I discovered something that won't come as a surprise to more experienced C++  programmers  but I was genuinely amazed. I had this line of code:
float x = 0.9f;
and when I had a look at it in the VS.NET 2003 debugger, it said x had a value of 0.89999998 !
IEEE754, which is the floating point representation used on most platforms that I am aware of, is a base two encoding for floating point values. Just as base 10 has irrational fractions (somewhat like 1/3) so does base two. The adventure here is that the fractions that are irrational in base two are different from those that are irrational in base 10. Apparently 9/10 is one of those irrational fractions in base 2.
An "irrational fraction" is a contradiction in terms, "irrational "
meaning "cannot be expressed as a ratio", i.e. "cannot be expressed
as a fraction". You mean "repeating" , as in "repeating decimal".
Now, what makes a decimal number repeat, is that it has factors
other than "2" and "5" in the denominator. A nonrepeating binary
ratio can only have powers of "2" in the denominator. So, evidently,
every repeating decimal number also repeats in binary, but there
are repeating binary nubers that won't repeat in decimal (e.g. 2/5).
In any case, that's not the reason for the loss of precision in
converting to floating point and back. What's "stored in binary"
is not the number itself, but the natural logarithm of the number.
Since _e_, the base of the natural logarithm is irrational, any
rational number is going to have a nonrational representation in
floating point. The only numbers that come out even in floating
point are irrational themselves. If you ever don't get a rounding
error when converting to floating point and back, it's essentially
coincidence (although it will be reproducible, of course).

Frederick
> In any case, that's not the reason for the loss of precision in converting to floating point and back. What's "stored in binary" is not the number itself, but the natural logarithm of the number. Since _e_, the base of the natural logarithm is irrational, any rational number is going to have a nonrational representation in floating point. The only numbers that come out even in floating point are irrational themselves. If you ever don't get a rounding error when converting to floating point and back, it's essentially coincidence (although it will be reproducible, of course).
I don't know where you get the natural log information from. http://www.nuvisionmiami.com/books/a...oating_tut.htm
Regards,
cadull
In article <d5**********@n nrp.waia.asn.au >,
"cadull" <cl********@spa m.cadull.com> writes: In any case, that's not the reason for the loss of precision in converting to floating point and back. What's "stored in binary" is not the number itself, but the natural logarithm of the number. Since _e_, the base of the natural logarithm is irrational, any rational number is going to have a nonrational representation in floating point. The only numbers that come out even in floating point are irrational themselves. If you ever don't get a rounding error when converting to floating point and back, it's essentially coincidence (although it will be reproducible, of course).
I don't know where you get the natural log information from.
Oops. It's log2. Fractions involving powers of two will thus
convert back and forth without loss.
Frederick
Frederick Bruckman wrote: In any case, that's not the reason for the loss of precision in converting to floating point and back. What's "stored in binary" is not the number itself, but the natural logarithm of the number.
Where did you get that idea from? Floating point numbers are usually stored
in base 2, not base e. I have seen a format where they were stored in base
16, but never e.
Frederick Bruckman wrote: Oops. It's log2.
No, it's not. It's just like 1.3 x 10^3, but in base 2 instead of base
10. The exponent is the logarithm of the value, but the fraction is just
the representation of the scaled value in the appropriate base. So 1/2
is represented in binary floating point as .1 base 2, 1 is represented
as .1 x 2^1, and 2 is represented as .1 x 2^2.

Pete Becker
Dinkumware, Ltd. ( http://www.dinkumware.com)
Rolf Magnus wrote: Floating point numbers approximate a continuous range of numbers. Since that range has an infinite count of different numbers, it isn't possible to store every number exactly in a computer.
It doesn't even have to be infinite, just more than the floating point
type can hold.

Pete Becker
Dinkumware, Ltd. ( http://www.dinkumware.com) This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics 
by: Christian Christmann 
last post by:
Hi,
just a general question.
Which data type is more precise for large values:
float or double?
Thank you.
Chris

by: Shi Jin 
last post by:
Hi there,
I have been thinking this for quite a while: if we are considering the
number of different representations of one type,say int and float,
is there any difference as long as they are the same bit long?
I am thinking this as an example for representing different colors. Is the
number of differnt colors a 32bit integer can represent any differnt from
using a 32bit floating point? It seems to me float has much more choices...

by: Gerald Lafreniere 
last post by:
{
float F=123.456000;
F*=1000; // Actually I used a for loop F*=10 three times.
printf("%f\n", F);
}
This will produce something like 123456.00XXXX, where XXXX are garbage
digits. Why is this happening, and how do I get rid of it? (using DevC++

by: maadhuu 
last post by:
hello ,
i would like to know as to why double is more efficient than float .
thanking you,
ranjan.

by: A. L. 
last post by:
Consider following code segment:
#1: double pi = 3.141592653589;
#2: printf("%lf\n", pi);
#3: printf("%1.12lf\n", pi);
#4: printf("%1.15lf\n", pi);
The above code outputs as following:
3.141593
 
by: Stu Smith 
last post by:
A feature we'd like to see in VS 2004 is a compiler warning for equality
comparisons on floating values. Why? Because the behaviour allowed under the
ECMA spec is somewhat suprising. (Well it suprised us).
If you run the program below in debug mode (F5), it prints True. If you run
it in nondebug mode (CtrlF5), you get False.
We had a look at the ECMA spec (CLI  12.1.3 line 35) and this behaviour
seems perfectly acceptable.

by: Madan 
last post by:
Hi all,
I had problem regarding float/double arithmetic only with + and 
operations, which gives inaccurate precisions. I would like to know how the
arithmetic operations are internally handled by C# or they are hardware
(processor) dependent. Basic addition operation errors, for ex:
3.6  2.4 = 1.19999999999 or 1.20000000003
There are the erroneous values I'm getting. I'm using C#.Net v1.1 Please
reply me how these operations are...

by: Jon Shemitz 
last post by:
Is there a difference between a constant like "12.34f" and "(float)
12.34"?
In principle, at least, the latter is a double constant being cast to
a float; while the two both generate actual constants, does the latter
ACTUALLY do a conversion at compile time? That is, are there constants
where
<constant>f != (float) <constant>

by: Erick> 
last post by:
hi all...
I've readed some lines about the difference between float and double
data types... but, in the real world, which is the best? when should we
use float or double??
thanks
Erick

by: Dilip 
last post by:
Recently in our code, I ran into a situation where were stuffing a
float inside a double. The precision was extended automatically
because of that. To make a long story short, this caused problems
elsewhere in another part of the system where that figure was used for
some calculation and some eventual truncation led to the system going
haywire. So my question is, given this code:
int main()
{
float f = 59.89F;

by: marktang 
last post by:
ONU (Optical Network Unit) is one of the key components for providing highspeed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
 
by: Hystou 
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...

by: Oralloy 
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bitfields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++12 std=c++20 Wnarrowing bit_field.cpp
Here is the code in...

by: jinu1996 
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...

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, ZWave, WiFi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...

by: agi2029 
last post by:
Let's talk about the concept of autonomous AI software engineers and nocode agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own....
Now, this would greatly impact the work of software developers. The idea...

by: 6302768590 
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
 
by: muto222 
last post by:
How can i add a mobile payment intergratation into php mysql website.

by: bsmnconsultancy 
last post by:
In today's digital era, a welldesigned website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
 