Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Jul 2012 19:33:07 +0200
From:      Rainer Hurling <rhurlin@gwdg.de>
To:        Steve Kargl <sgk@troutmask.apl.washington.edu>
Cc:        David Schultz <das@FreeBSD.org>, freebsd-current@FreeBSD.org, Bruce Evans <bde@FreeBSD.org>
Subject:   Re: Use of C99 extra long double math functions after r236148
Message-ID:  <50102DD3.6010700@gwdg.de>
In-Reply-To: <20120725170004.GA72338@troutmask.apl.washington.edu>
References:  <20120708124047.GA44061@zim.MIT.EDU> <210816F0-7ED7-4481-ABFF-C94A700A3EA0@bsdimp.com> <20120708233624.GA53462@troutmask.apl.washington.edu> <4FFBF16D.2030007@gwdg.de> <2A1DE516-ABB4-49D7-8C3D-2C4DA2D9FCF5@bsdimp.com> <4FFC412B.4090202@gwdg.de> <20120710151115.GA56950@zim.MIT.EDU> <4FFC5E5D.8000502@gwdg.de> <20120710225801.GB58778@zim.MIT.EDU> <50101EDE.6030509@gwdg.de> <20120725170004.GA72338@troutmask.apl.washington.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
On 25.07.2012 19:00 (UTC+2), Steve Kargl wrote:
> On Wed, Jul 25, 2012 at 06:29:18PM +0200, Rainer Hurling wrote:
>>
>> Many thanks to you three for implementing expl() with r238722 and r238724.
>>
>> I am not a C programmer, but would like to ask if the following example
>> is correct and suituable as a minimalistic test of this new C99 function?
>>
>
> It's not clear to me what you mean by test.  If expl() is
> not available in libm, then linking the code would fail.
> So, testing for the existence of expl() (for example,
> in a configure script) is as simple as

Sorry for not being clear enough. I didn't mean testing for the 
existence, but for some comparable output between exp() and expl(), on a 
system with expl() available in libm.

> #include <math.h>
> long double
> func(long double x)
> {
>    return (expl(x));
> }
>
>> //-----------------------------------
>> #include <stdio.h>
>> #include <math.h>
>>
>> int main(void)
>> {
>>    double c = 2.0;
>>    long double d = 2.0;
>>
>>    double e = exp(c);
>>    long double f = expl(d);
>>
>>    printf("exp(%f)  is %.*f\n",  c, 90, e);
>>    printf("expl(%Lf) is %.*Lf\n", d, 90, f);
>
> If you mean testing that the output is correct, then
> asking for 90 digits is of little use.  The following
> is sufficient (and my actually produce a digit or two
> more than is available in number)

Ok, I understand. I printed the 90 digits to be able to take a look at 
the decimal places, I did not expect to get valid digits in this area.

> troutmask:fvwm:kargl[203] diff -u a.c.orig a.c
> --- a.c.orig    2012-07-25 09:38:31.000000000 -0700
> +++ a.c 2012-07-25 09:40:36.000000000 -0700
> @@ -1,5 +1,6 @@
>   #include <stdio.h>
>   #include <math.h>
> +#include <float.h>
>
>   int main(void)
>   {
> @@ -9,8 +10,8 @@
>     double e = exp(c);
>     long double f = expl(d);
>
> -  printf("exp(%f)  is %.*f\n",  c, 90, e);
> -  printf("expl(%Lf) is %.*Lf\n", d, 90, f);
> +  printf("exp(%f)  is %.*f\n",  c, DBL_DIG+2, e);
> +  printf("expl(%Lf) is %.*Lf\n", d, LDBL_DIG+2, f);
>
>     return 0;
>   }

Thanks, I was not aware of DBL_DIG and LDBL_DIG.

>>    return 0;
>> }
>> //-----------------------------------
>>
>> Compiled with 'c99 -o math_expl math_expl.c -lm' and running afterwards
>> it gives me:
>>
>> exp(2.000000)  is
>> 7.38905609893065040
>> expl(2.000000) is
>> 7.38905609893065022739
>>
>> Already the sixteenth position after decimal point differs.
>
> DBL_DIG is 15 on x86 hardware and LDBL_DIG is 18.  You can
> expect at most 15 correct digits from exp().
>
>> Please forgive me, if this is a really stupid approach for producing
>> some expl() output.
>
> If you actually want to test expl() to see if it is producing
> a decent result, you need a reference solution that contains
> a higher precision.  I use mpfr with 256 bits of precision.
>
> troutmask:fvwm:kargl[213] ./testl -V 2
> ULP = 0.3863
>    x = 2.000000000000000000e+00
> libm: 7.389056098930650227e+00 0x1.d8e64b8d4ddadcc4p+2
> mpfr: 7.389056098930650227e+00 0x1.d8e64b8d4ddadcc4p+2
> mpfr: 7.3890560989306502272304274605750078131803155705518\
>            47324087127822522573796079054e+00
> mpfr: 0x7.63992e35376b730ce8ee881ada2aeea11eb9ebd93c887eb59ed77977d109f148p+0
>
> The 1st 'mpfr:' line is produced after converting the results
> fof mpfr_exp() to long double.  The 2nd 'mpfr:' line is
> produced by mpfr_printf() where the number of printed
> digits depends on the 256-bit precision.  The last 'mpfr:'
> line is mpfr_printf()'s hex formatting.  Unfortunately, it
> does not normalize the hex representation to start with
> '0x1.', which makes comparison somewhat difficult.
>

Many thanks also for this mpfr example. This helps me to understand a 
little bit more what is going here. So on amd64 even the expl() result 
is far from what mpfr provides.



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