libc/newlib/libm/math/w_exp2.c
Szabolcs Nagy fb929067db New exp and exp2 implementations
The new implementations are provided under !__OBSOLETE_MATH, they use
ISO C99 code.  There are several settings, with the default one the
worst case error in nearest rounding mode is 0.509 ULP for exp and
0.507 ULP for exp2 when a multiply and add is contracted into an fma.
They use a shared 2 KB lookup table, on aarch64 .text+.rodata size
of libm.a is increased by 1868 bytes.  The w_*.c wrappers are disabled
for the new code as it takes care of error handling inline.

The old exp2(x) code used to be just pow(2,x) so the speedup there
is more significant.

The file name has no special prefix to avoid any name collision with
existing files.

Improvements on Cortex-A72:
exp latency: 3.2x
exp thruput: 4.1x
exp2 latency: 7.8x
exp2 thruput: 18.8x
2018-06-27 15:40:49 +02:00

73 lines
1.4 KiB
C

/* @(#)w_exp2.c 5.1 93/09/24 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
FUNCTION
<<exp2>>, <<exp2f>>---exponential, base 2
INDEX
exp2
INDEX
exp2f
SYNOPSIS
#include <math.h>
double exp2(double <[x]>);
float exp2f(float <[x]>);
DESCRIPTION
<<exp2>> and <<exp2f>> calculate 2 ^ <[x]>, that is,
@ifnottex
2 raised to the power <[x]>.
@end ifnottex
@tex
$2^x$
@end tex
You can use the (non-ANSI) function <<matherr>> to specify
error handling for these functions.
RETURNS
On success, <<exp2>> and <<exp2f>> return the calculated value.
If the result underflows, the returned value is <<0>>. If the
result overflows, the returned value is <<HUGE_VAL>>. In
either case, <<errno>> is set to <<ERANGE>>.
PORTABILITY
ANSI C, POSIX.
*/
/*
* wrapper exp2(x)
*/
#include "fdlibm.h"
#if __OBSOLETE_MATH
#include <errno.h>
#include <math.h>
#ifndef _DOUBLE_IS_32BITS
#ifdef __STDC__
double exp2(double x) /* wrapper exp2 */
#else
double exp2(x) /* wrapper exp2 */
double x;
#endif
{
return pow(2.0, x);
}
#endif /* defined(_DOUBLE_IS_32BITS) */
#endif /* __OBSOLETE_MATH */