Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Mar 1999 22:35:53 -0500 (EST)
From:      "Crist J. Clark" <cjc@cc942873-a.ewndsr1.nj.home.com>
To:        gjb@comkey.com.au (Greg Black)
Cc:        cjclark@home.com, freebsd-questions@FreeBSD.ORG
Subject:   Re: FP Math
Message-ID:  <199903030335.WAA03732@cc942873-a.ewndsr1.nj.home.com>
In-Reply-To: <19990303022902.23520.qmail@alpha.comkey.com.au> from Greg Black at "Mar 3, 99 12:29:02 pm"

next in thread | previous in thread | raw e-mail | index | archive | help
Greg Black wrote,
> > Example: Here are two quick C program that I think show why I am
> > confused. The first produces an exception and core dumps (for me
> > anyway). In this one, I have set floats to values outside of their
> > range. It dumps at the point marked,
> 
> This question has nothing at all to do with FreeBSD (or any OS)
> and everything to do with a failure to understand the rules of
> the C language, so I'll keep this very short.

I asked on FreeBSD because I do not get these type of errors when I
run on one of my IRIXes.

> > #include <stdio.h>
> > 
> > int main()
> > {
> >   float a = -1.0e-41;
> 
> At this point your program has entered the domain of undefined
> behaviour and from here on the compiler is free to do absolutely
> anything it likes, including generating the code represented by
> the following fragment:
> 
>     execl("/bin/rm", "rm", "-rf", "/", 0);
>
> If you assign a double constant to a float and that constant is
> outside the range of the float (as defined precisely in the
> header <float.h>), then the behaviour is undefined.

OK, your sarcasm aside, now that you mention it, I see how assigning a
constant outside of the float range is different than running into
overflows during processing.

> This also means that the program is allowed to appear to get
> some things right, but gives you no right to expect that.  As
> for why anybody would deliberately do something like this, given
> its complete uselessness, that's another question.

To simulate where a more complex and useful program is failing.

> In short, the answer is: "you can't do that."

I won't.

> > Could someone explain this?
> 
> Done.

OK, but why does this give me a floating point exception,

#include <stdio.h>

int main()
{

  double a = 1.0e41;
  float b;

  b = (float)a;

  printf("%f\n",b);

  return 0;
}

This time I skipped any problems of assigning a out-of-bounds value in
a constant expression, but get the same result. This is the question I
intended to ask.

> Anybody who wants or needs further illumination should either
> get and read the C Standard or visit comp.lang.c (if it still
> exists).

I have found no further illumination in my K&R. As far as I can tell
from it, all of the above should give defined results. I was under the
impression a cast would produce the under/overflow conditions outlined
in 'man math.'

If my motivation is of any help, I have computational programs that
I sometimes run on my FreeBSD machine and sometimes on IRIX. The main
reason I sometimes resort to the IRIX is because I do not get the
pesky FP exceptions there. Same source code, same input, same
compiler (gcc), but different results. My best guess is the math
libraries, and I am trying to figure out where the difference is and
how to fix it.

For example, the above program returns,

inf

On my SGI.
-- 
Crist J. Clark                           cjclark@home.com


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903030335.WAA03732>