Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Mar 1999 12:03:04 -0500 (EST)
From:      "Crist J. Clark" <cjc@cc942873-a.ewndsr1.nj.home.com>
To:        freebsd-questions@FreeBSD.ORG (FreeBSD Questions)
Subject:   FP Math
Message-ID:  <199903021703.MAA02135@cc942873-a.ewndsr1.nj.home.com>

next in thread | raw e-mail | index | archive | help
I have been having some trouble with floating point
operations, namely the dreaded,

Floating exception (core dumped)

Having a look at 'man math' only really served to confuse me more. The
manpage lays out information about two libraries, DEC VAX-11
D_floating-point and IEEE STANDARD 754 Floating-Point
Arithmetic. However, no where does the manpage really come clean and
admit what we are using. I _think_ I am using the IEEE Standard, but
have been getting weird results. See below for an example. I think the
problems are related to float-double issues.

Why does the manpage inform me about both? Does it mean I can somehow
select one or the other? If I can, how do I do it?

Thanks.


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,

--- C Code ---
#include <stdio.h>

int main()
{
  float a = -1.0e-41;
  float b = -1.0e-41;
  float c =  1.0e-41;
  float d;

  printf("%g\n%g\n",a,c); /* This outputs values a and b different
                             than those set */

  d = a/b;                /* This works */

  printf("%g\n",d);       /* Still OK */

  d /= c;                 /* FP exception, core dump */

  printf("%g\n",d);

  return 0;
}

--- End C Code ---

Now the problem printing I could understand. I have set the floats
outside of their range. However, if I change the initial values
slightly, 

--- C Code ---
#include <stdio.h>

int main()
{
  float a = -1.0e41;
  float b = -1.0e-41;
  float c =  1.0e-41;
  float d;

  printf("%g\n%g\n",a,c); /* This gets a as it should be now */

  d = a/b;                /* This works */

  printf("%g\n",d);       /* Still OK */

  d /= c;                 /* now this works! */

  printf("%g\n",d);

  return 0;
}
--- End C Code ---

Could someone explain this?

[Should I send this to -hackers instead?]
-- 
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?199903021703.MAA02135>