Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Why different from expectation

Reply
Thread Tools

Why different from expectation

 
 
yezi
Guest
Posts: n/a
 
      11-28-2005
Hi: All:

I have question with the data type problem. According to the C
standard. IEEE 754

float 4 3.4x10-38E..3.4x10+38E
double 8 1.7x10-308E..1.7x10+308E
long double 12 ???

The code function is (0.000200-0.000300)*(0.000200-0.000300)
suppose the result (difference ) should be the 10 (-

difference I claim is double;

But THe code result is :
fp1 0.000200
------------------------
fp2 0.000300
difference is 0.000000

which means the result is zero.

Why?

Thanks
bin YE

 
Reply With Quote
 
 
 
 
Keith Thompson
Guest
Posts: n/a
 
      11-28-2005
"yezi" <(E-Mail Removed)> writes:
> I have question with the data type problem. According to the C
> standard. IEEE 754
>
> float 4 3.4x10-38E..3.4x10+38E
> double 8 1.7x10-308E..1.7x10+308E
> long double 12 ???


The C standard allows, but does not require, IEEE 754 floating-point.

> The code function is (0.000200-0.000300)*(0.000200-0.000300)
> suppose the result (difference ) should be the 10 (-
>
> difference I claim is double;
>
> But THe code result is :
> fp1 0.000200
> ------------------------
> fp2 0.000300
> difference is 0.000000
>
> which means the result is zero.


It's difficult to tell what problem you're describing. Try posting
some actual code along with the output it produces, and describe how
it differs from the output you expected.

A couple of thoughts:

Floating-point is inexact. For example, the value 0.1 cannot be
represented exactly in binary floating-point; the closest equivalent
in type double, on one system I've tried, is about
0.10000000000000000555111512312578.

If you're using a "%f" output format, it's not going to show very
small values very well. A printed result of 0.000000 doesn't imply
that the value is actually equal to 0.0, just that it's within a
certain range close to 0.0 (which 1.0e-8 probably is). Try the "%g"
format instead; it switches to scientific notation for very large or
very small values.

--
Keith Thompson (The_Other_Keith) http://www.velocityreviews.com/forums/(E-Mail Removed) <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
 
Reply With Quote
 
 
 
 
Keith Thompson
Guest
Posts: n/a
 
      11-28-2005
"yezi" <(E-Mail Removed)> writes:
> I have question with the data type problem. According to the C
> standard. IEEE 754
>
> float 4 3.4x10-38E..3.4x10+38E
> double 8 1.7x10-308E..1.7x10+308E
> long double 12 ???
>
> The code function is (0.000200-0.000300)*(0.000200-0.000300)
> suppose the result (difference ) should be the 10 (-
>
> difference I claim is double;
>
> But THe code result is :
> fp1 0.000200
> ------------------------
> fp2 0.000300
> difference is 0.000000
>
> which means the result is zero.


One more thing I forgot to mention: Read section 14 of the C FAQ.
<http://www.eskimo.com/~scs/C-faq/top.html>.

--
Keith Thompson (The_Other_Keith) (E-Mail Removed) <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
 
Reply With Quote
 
yezi
Guest
Posts: n/a
 
      11-29-2005
thanks, I will first read the FAQ .

 
Reply With Quote
 
Gordon Burditt
Guest
Posts: n/a
 
      11-29-2005
>I have question with the data type problem. According to the C
>standard. IEEE 754
>
>float 4 3.4x10-38E..3.4x10+38E
>double 8 1.7x10-308E..1.7x10+308E
>long double 12 ???
>
>The code function is (0.000200-0.000300)*(0.000200-0.000300)
>suppose the result (difference ) should be the 10 (-
>
>difference I claim is double;
>
>But THe code result is :
>fp1 0.000200
>------------------------
>fp2 0.000300
>difference is 0.000000


>which means the result is zero.


You print out a value you expect to be 1.0e-8 with *six* digits
after the decimal point, and you wonder why it shows as zero?

Try printing the result with a format like %200.100f . You'll
notice that the result isn't exact. None of the following numbers
are exactly representable in binary floating point: 0.000200,
0.000300, 1.0e-8. For that matter, *most* aren't unless they are
exact integers. A few exceptions are: 0.5, 0.25, 0.75, 0.125,
0.375, 0.625, 0.875 .

Gordon L. Burditt
 
Reply With Quote
 
Keith Thompson
Guest
Posts: n/a
 
      11-29-2005
"yezi" <(E-Mail Removed)> writes:
> thanks, I will first read the FAQ .


Please read this as well:

<http://cfaj.freeshell.org/google/>

(Thanks to Chris F.A. Johnson for setting up this page.)

--
Keith Thompson (The_Other_Keith) (E-Mail Removed) <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
 
Reply With Quote
 
Richard Heathfield
Guest
Posts: n/a
 
      11-29-2005
Keith Thompson said:

> "yezi" <(E-Mail Removed)> writes:
>> thanks, I will first read the FAQ .

>
> Please read this as well:
>
> <http://cfaj.freeshell.org/google/>
>
> (Thanks to Chris F.A. Johnson for setting up this page.)
>


Just a nit...

<li><a
href="http://www.catb.org/~esr/faqs/smart-questions.html#bespecific">http://www.catb.org/~esr/faqs/smart-questions.html#bespecifichttp://en.wikipedia.org/wiki/Netiquette</a>

is a bit longer than it should be.

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
 
Reply With Quote
 
jacob navia
Guest
Posts: n/a
 
      11-29-2005
yezi wrote:

> Hi: All:
>
> I have question with the data type problem. According to the C
> standard. IEEE 754
>
> float 4 3.4x10-38E..3.4x10+38E
> double 8 1.7x10-308E..1.7x10+308E
> long double 12 ???
>
> The code function is (0.000200-0.000300)*(0.000200-0.000300)
> suppose the result (difference ) should be the 10 (-
>
> difference I claim is double;
>
> But THe code result is :
> fp1 0.000200
> ------------------------
> fp2 0.000300
> difference is 0.000000
>
> which means the result is zero.
>
> Why?
>
> Thanks
> bin YE
>

Using lcc-win32 I type:
#include <stdio.h>
int main(void)
{
double f = 0.0002;
double g = 0.0003;
double delta = (f-g)*(f-g);
printf("%e\n",delta);
}

D:\lcc\mc63\test> lc texact.c
D:\lcc\mc63\test> texact
1.000000e-008

D:\lcc\mc63\test>

You are using the wrong printf format.
 
Reply With Quote
 
yezi
Guest
Posts: n/a
 
      11-29-2005
This is work with %e, I find the type declarion and printf in sort of
complex . It should be matched very well then got u want .

 
Reply With Quote
 
Default User
Guest
Posts: n/a
 
      11-29-2005
yezi wrote:

> This is work with %e, I find the type declarion and printf in sort of
> complex . It should be matched very well then got u want .


What is?


Brian

--
Please quote enough of the previous message for context. To do so from
Google, click "show options" and use the Reply shown in the expanded
header.
 
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
implement Expectation maximization algo in vhdl debolina VHDL 0 06-16-2011 03:22 PM
why why why why why Mr. SweatyFinger ASP .Net 4 12-21-2006 01:15 PM
findcontrol("PlaceHolderPrice") why why why why why why why why why why why Mr. SweatyFinger ASP .Net 2 12-02-2006 03:46 PM
Reasonable expectation: for(it = v.begin(); it != v.end(); it++) Steven T. Hatton C++ 6 08-22-2004 08:54 PM
"expectation failed" for webservice behind Content Caching Engine KumarForG Cisco 0 04-06-2004 01:36 PM



Advertisments