Skip to content

Instantly share code, notes, and snippets.

@ewmoore
Last active December 25, 2015 07:28
Show Gist options
  • Save ewmoore/6939178 to your computer and use it in GitHub Desktop.
Save ewmoore/6939178 to your computer and use it in GitHub Desktop.
#!/bin/bash
if [ $# -eq 2 ]
then
funcs=($2)
else
funcs=(CCOS CSIN CTAN CCOSH CSINH CTANH CACOS CASIN CATAN CACOSH CASINH CATANH CEXP CLOG CSQRT CPOW)
fi
for f in ${funcs[*]}
do
echo $f
gcc -lm -D$1 -D$f numpy/core/test_c99complex.c build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/numpy/core/src/npymath/*.o
./a.out
done
diff --git a/numpy/core/setup.py b/numpy/core/setup.py
index 8477e89..66e36be 100644
--- a/numpy/core/setup.py
+++ b/numpy/core/setup.py
@@ -208,43 +208,43 @@ def check_complex(config, mathlibs):
if st:
pub.append(('NPY_HAVE_%s' % type2def(t), 1))
- def check_prec(prec):
- flist = [f + prec for f in C99_COMPLEX_FUNCS]
- decl = dict([(f, True) for f in flist])
- if not config.check_funcs_once(flist, call=decl, decl=decl,
- libraries=mathlibs):
- for f in flist:
- if config.check_func(f, call=True, decl=True,
- libraries=mathlibs):
- priv.append((fname2def(f), 1))
- else:
- priv.extend([(fname2def(f), 1) for f in flist])
-
- flist = [f + prec for f in C99_COMPLEX_FUNCS_CHECKED]
- decl = dict([(f, True) for f in flist])
- exists = []
- if not config.check_funcs_once(flist, call=decl, decl=decl,
- libraries=mathlibs):
- for f in C99_COMPLEX_FUNCS_CHECKED:
- if config.check_func(f + prec, call=True, decl=True,
- libraries=mathlibs):
- exists.append(f)
- else:
- exists.extend(C99_COMPLEX_FUNCS_CHECKED)
-
- if len(exists) > 0:
- fp = open('./numpy/core/test_c99complex.c', 'r')
- obody = fp.read()
- fp.close()
- precname = {'f':'FLOAT', '':'DOUBLE', 'l':'LONGDOUBLE'}[prec]
- for f in exists:
- body = obody.replace('PYTESTPRECISION', precname).replace('PYTESTFUNC', f.upper())
- if config.try_run(body, libraries=mathlibs):
- priv.append((fname2def(f + prec), 1))
-
- check_prec('')
- check_prec('f')
- check_prec('l')
+# def check_prec(prec):
+# flist = [f + prec for f in C99_COMPLEX_FUNCS]
+# decl = dict([(f, True) for f in flist])
+# if not config.check_funcs_once(flist, call=decl, decl=decl,
+# libraries=mathlibs):
+# for f in flist:
+# if config.check_func(f, call=True, decl=True,
+# libraries=mathlibs):
+# priv.append((fname2def(f), 1))
+# else:
+# priv.extend([(fname2def(f), 1) for f in flist])
+#
+# flist = [f + prec for f in C99_COMPLEX_FUNCS_CHECKED]
+# decl = dict([(f, True) for f in flist])
+# exists = []
+# if not config.check_funcs_once(flist, call=decl, decl=decl,
+# libraries=mathlibs):
+# for f in C99_COMPLEX_FUNCS_CHECKED:
+# if config.check_func(f + prec, call=True, decl=True,
+# libraries=mathlibs):
+# exists.append(f)
+# else:
+# exists.extend(C99_COMPLEX_FUNCS_CHECKED)
+#
+# if len(exists) > 0:
+# fp = open('./numpy/core/test_c99complex.c', 'r')
+# obody = fp.read()
+# fp.close()
+# precname = {'f':'FLOAT', '':'DOUBLE', 'l':'LONGDOUBLE'}[prec]
+# for f in exists:
+# body = obody.replace('PYTESTPRECISION', precname).replace('PYTESTFUNC', f.upper())
+# if config.try_run(body, libraries=mathlibs):
+# priv.append((fname2def(f + prec), 1))
+#
+# check_prec('')
+# check_prec('f')
+# check_prec('l')
return priv, pub
diff --git a/numpy/core/src/npymath/npy_math_complex.c.src b/numpy/core/src/npymath/npy_math_complex.c.src
index 68c629b..3308cdf 100644
--- a/numpy/core/src/npymath/npy_math_complex.c.src
+++ b/numpy/core/src/npymath/npy_math_complex.c.src
@@ -1610,3 +1610,149 @@ static inline npy_longdouble _real_part_reciprocall(npy_longdouble x,
/**end repeat1**/
/**end repeat**/
+
+void npy_cacosl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_cacosl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_casinl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_casinl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_catanl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_catanl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_cacoshl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_cacoshl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_casinhl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_casinhl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_catanhl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_catanhl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_ccosl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_ccosl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_csinl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_csinl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_ctanl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_ctanl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_ccoshl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_ccoshl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_csinhl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_csinhl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_ctanhl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_ctanhl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_cexpl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_cexpl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_clogl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_clogl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_csqrtl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ z = npy_csqrtl(z);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
+void npy_cpowl_wrap(npy_longdouble zr, npy_longdouble zi, npy_longdouble wr, npy_longdouble wi, npy_longdouble* rr, npy_longdouble* ri)
+{
+ npy_clongdouble z = npy_cpackl(zr, zi);
+ npy_clongdouble w = npy_cpackl(wr, wi);
+ z = npy_cpowl(z, w);
+ *rr = npy_creall(z);
+ *ri = npy_cimagl(z);
+ return;
+}
+
diff --git a/numpy/core/test_c99complex.c b/numpy/core/test_c99complex.c
index bb841aa..464a373 100644
--- a/numpy/core/test_c99complex.c
+++ b/numpy/core/test_c99complex.c
@@ -63,6 +63,254 @@ const TYPE NZERO = -1.0 * 0.0;
#define ADDSUFFIX_INT(A, B) CONCAT(A, B)
#define ADDSUFFIX(A) ADDSUFFIX_INT(A, SUFFIX)
+complex TYPE ADDSUFFIX(npy_cacos)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_casin)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_catan)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_cacosh)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_casinh)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_catanh)(complex TYPE);
+
+complex TYPE ADDSUFFIX(npy_ccos)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_csin)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_ctan)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_ccosh)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_csinh)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_ctanh)(complex TYPE);
+
+complex TYPE ADDSUFFIX(npy_clog)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_cexp)(complex TYPE);
+complex TYPE ADDSUFFIX(npy_cpow)(complex TYPE, complex TYPE);
+complex TYPE ADDSUFFIX(npy_csqrt)(complex TYPE);
+
+#ifndef LONGDOUBLE
+#define cacos npy_cacos
+#define casin npy_casin
+#define catan npy_catan
+#define cacosh npy_cacosh
+#define casinh npy_casinh
+#define catanh npy_catanh
+
+#define ccos npy_ccos
+#define csin npy_csin
+#define ctan npy_ctan
+#define ccosh npy_ccosh
+#define csinh npy_csinh
+#define ctanh npy_ctanh
+
+#define clog npy_clog
+#define cexp npy_cexp
+#define cpow npy_cpow
+#define csqrt npy_csqrt
+#else
+
+void npy_cacosl_wrap(long double, long double, long double *, long double *);
+void npy_casinl_wrap(long double, long double, long double *, long double *);
+void npy_catanl_wrap(long double, long double, long double *, long double *);
+void npy_cacoshl_wrap(long double, long double, long double *, long double *);
+void npy_casinhl_wrap(long double, long double, long double *, long double *);
+void npy_catanhl_wrap(long double, long double, long double *, long double *);
+void npy_ccosl_wrap(long double, long double, long double *, long double *);
+void npy_csinl_wrap(long double, long double, long double *, long double *);
+void npy_ctanl_wrap(long double, long double, long double *, long double *);
+void npy_ccoshl_wrap(long double, long double, long double *, long double *);
+void npy_csinhl_wrap(long double, long double, long double *, long double *);
+void npy_ctanhl_wrap(long double, long double, long double *, long double *);
+void npy_cexpl_wrap(long double, long double, long double *, long double *);
+void npy_clogl_wrap(long double, long double, long double *, long double *);
+void npy_csqrtl_wrap(long double, long double, long double *, long double *);
+void npy_cpowl_wrap(long double, long double, long double, long double, long double *, long double *);
+
+long double complex cpacklll(long double r, long double i)
+{
+ union {
+ long double complex z;
+ long double a[2];
+ } z1;
+ z1.a[0] = r;
+ z1.a[1] = i;
+ return z1.z;
+}
+
+long double complex wcacosl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_cacosl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcasinl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_casinl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcatanl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_catanl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcacoshl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_cacoshl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcasinhl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_casinhl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcatanhl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_catanhl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wccosl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_ccosl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcsinl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_csinl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wctanl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_ctanl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wccoshl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_ccoshl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcsinhl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_csinhl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wctanhl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_ctanhl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcexpl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_cexpl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wclogl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_clogl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcsqrtl(long double complex z)
+{
+ long double zr, zi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ npy_csqrtl_wrap(zr, zi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+long double complex wcpowl(long double complex z, long double complex w)
+{
+ long double zr, zi, wr, wi, rr, ri;
+ zr = creall(z);
+ zi = cimagl(z);
+ wr = creall(w);
+ wi = cimagl(w);
+ npy_cpowl_wrap(zr, zi, wr, wi, &rr, &ri);
+ z = cpacklll(rr, ri);
+ return z;
+}
+
+#define cacos wcacos
+#define casin wcasin
+#define catan wcatan
+#define cacosh wcacosh
+#define casinh wcasinh
+#define catanh wcatanh
+#define ccos wccos
+#define csin wcsin
+#define ctan wctan
+#define ccosh wccosh
+#define csinh wcsinh
+#define ctanh wctanh
+#define cexp wcexp
+#define clog wclog
+#define csqrt wcsqrt
+#define cpow wcpow
+#endif
+
#define TEST_PRINTF(func, xr, xi, er, ei, rr, ri) \
printf("%d: " STRINGIZE(func) STRINGIZE(SUFFIX) "(" FMT " + " FMT "j): " \
"expected: " FMT " + " FMT "j: received: " FMT " + " FMT "j\n", \
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment