Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 May 2013 12:14:10 -0700
From:      Steve Kargl <sgk@troutmask.apl.washington.edu>
To:        freebsd-numerics@freebsd.org
Subject:   cosh magic number?
Message-ID:  <20130531191410.GA74343@troutmask.apl.washington.edu>

next in thread | raw e-mail | index | archive | help
In msun/src/e_cosh.c, one finds the comment

 *
 *                                 exp(x) +  1/exp(x)
 * ln2/2 <= x <= 22 :  cosh(x) := -------------------
 *                                        2

Where does the magic number 22 come from?

Using exp(-|2x|) = 2**(1-p) with p = 53 for double, I
arrive at 18.022, which is a little too small.

#include <stdio.h>
#include <math.h>

int
main(void)
{
	double x, y, z;
	x = 18.022;
	/* x = 19; */
	y = exp(x);
	z = cosh(x);
	printf("%a\n%a\n%a\n", z, 0.5*(y + 1/y), 0.5 * y);
	return 0;
}

% cc -o z -O a.c -lm && ./z
0x1.000b5bd5b4beep+25
0x1.000b5bd5b4beep+25
0x1.000b5bd5b4bedp+25

Rounding up to 19 gives

% cc -o z -O a.c -lm && ./z
0x1.546d8f9ed26e1p+26
0x1.546d8f9ed26e1p+26
0x1.546d8f9ed26e1p+26

So, why 22?

-- 
Steve



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