[CLN-list] floating point underflow - a possible explanation
Michael Schuster
schuster at enertex.de
Mon Oct 29 17:55:30 CET 2007
Hi again,
when thinking of my problem, I found the following (it's a bit talking to
myself, but perhaps you can find it useful).
+ The problem with the underflow happens (at least in my case) because the
declaration in fnCalc3()
Real y2 = Real(string("-6.6061s14"));y Real wrapper class.
makes a cl_SF out of y2. The other variable is cl_LF. It seems this causes the
underflow.
+ Actually I thought, this problem can not occur - that's why I use the
wrapper class, as I always use the double initialisation-
But I found this:
valarray<Real> c;
c.resize(3);
Real dd=c[0];
valarray will call default constructor which is Real():cl_F() and therefore
produce a c[0] with type cl_SF. Ok, didnot think of that. My problem.
Anyway with the following I get a lot of conversions then
dd=Real(1.0/3.0); <<= cl_LF
dd=Real(1.0/3.0)+c[0]; <<= back cl_SF again
dd=c[0]+Real(1.0/3.0); <<= still cl_SF
So once I have cl_SF in my system, it can be anywhere. So now I changed
default constructor to
Real():cl_F(cl_float(cl_I(0),float_format(_PRECISION_CLN_NEWMAT))) {};
and everthing seems ok now.
To be absolutely sure I can change also
Real(const cl_F &f):cl_F(cl_float(f,float_format(_PRECISION_CLN))) {}
in my wrapper. (The string initialization is intentional.)
Michael
Watch this!! 1.49557e-52
Am Montag 29 Oktober 2007 schrieb Michael Schuster:
> Hi Richy & Cln-List,
>
> Am Samstag 27 Oktober 2007 schrieb Richard B. Kreckel:
> > In order for anyone to be able to help you it is essential that you
> > write a reduced test case where the problem appears and can be
> > investigated.
>
> Attachted I made a little demo programm which shows the problem. My output
> is :
> fnCalc1:1.49557e-52
> fnCalc2:1.49557e-52
> fnCalc2 + 0 :1.49557e-52
> fnCalc3:0
> Watch this!! 0
> Watch this!! 1.49557e-52
>
> The line >>Watch this!! 0<< should be >>Watch this!! 1.49557e-52<< at
> least in my mathematical opion.
>
> Ok, I donot know if my construct with the class Real is a possibile good
> design. I wanted to have an easy possibility to switch from built-in-double
> type to a class type with higher precision.
>
> Another problem is why I come (in my original programm) to a Real
> value-type of cl_SF while I only use the Real base class with cl_float()
> function as in the demo. But this is for next mailings here.
>
> My system:
> $gcc --version
> gcc (GCC) 4.0.2 20050901 (prerelease) (SUSE Linux)
> Copyright (C) 2005 Free Software Foundation, Inc.
> Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es
> gibt KEINE Garantie; auch nicht für VERKAUFBARKEIT oder FÜR SPEZIELLE
> ZWECKE.
>
> $rpm -q cln
> cln-1.1.9-5
>
> Thanks for any hint.
>
> Michael
More information about the CLN-list
mailing list