[gnumeric] Introspection fixes
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Introspection fixes
- Date: Tue, 16 Feb 2016 14:17:25 +0000 (UTC)
commit 65664eca4206875a392852501e007d7534bf068e
Author: Morten Welinder <terra gnome org>
Date: Tue Feb 16 09:17:06 2016 -0500
Introspection fixes
src/complex.c | 21 +++++++++++++++++++++
src/complex.h | 6 ++++--
src/sf-gamma.c | 50 ++++++++++++++++++++++++++++++++++++--------------
src/sf-gamma.h | 4 ++--
4 files changed, 63 insertions(+), 18 deletions(-)
---
diff --git a/src/complex.c b/src/complex.c
index b14ec1c..ca88221 100644
--- a/src/complex.c
+++ b/src/complex.c
@@ -178,3 +178,24 @@ gnm_complex_invalid_p (gnm_complex const *src)
}
/* ------------------------------------------------------------------------- */
+
+static gnm_complex *
+dup_complex (gnm_complex *src)
+{
+ return g_memdup (src, sizeof (*src));
+}
+
+GType
+gnm_complex_get_type (void)
+{
+ static GType t = 0;
+
+ if (t == 0)
+ t = g_boxed_type_register_static
+ ("gnm_complex",
+ (GBoxedCopyFunc)dup_complex,
+ (GBoxedFreeFunc)g_free);
+ return t;
+}
+
+/* ------------------------------------------------------------------------- */
diff --git a/src/complex.h b/src/complex.h
index ee49e04..e9c1b0e 100644
--- a/src/complex.h
+++ b/src/complex.h
@@ -9,7 +9,7 @@
G_BEGIN_DECLS
#ifdef GNM_WITH_LONG_DOUBLE
-#define gnm_complex GOComplexl
+typedef GOComplexl gnm_complex;
#define gnm_complex_init go_complex_initl
#define gnm_complex_add go_complex_addl
#define gnm_complex_sub go_complex_subl
@@ -34,7 +34,7 @@ G_BEGIN_DECLS
#define gnm_complex_from_polar go_complex_from_polarl
#define gnm_complex_from_polar_pi go_complex_from_polar_pil
#else
-#define gnm_complex GOComplex
+typedef GOComplex gnm_complex;
#define gnm_complex_init go_complex_init
#define gnm_complex_add go_complex_add
#define gnm_complex_sub go_complex_sub
@@ -68,6 +68,8 @@ int gnm_complex_from_string (gnm_complex *dst, char const *src, char *imunit);
int gnm_complex_invalid_p (gnm_complex const *src);
+GType gnm_complex_get_type (void);
+
/* ------------------------------------------------------------------------- */
// Value interface
diff --git a/src/sf-gamma.c b/src/sf-gamma.c
index a547ddc..5e3bae2 100644
--- a/src/sf-gamma.c
+++ b/src/sf-gamma.c
@@ -1249,18 +1249,24 @@ static const guint32 lanczos_denom[G_N_ELEMENTS(lanczos_num)] = {
13339535, 2637558, 357423, 32670, 1925, 66, 1
};
+/**
+ * gnm_complex_gamma:
+ * @z: a complex number
+ *
+ * Returns: (transfer full): the Gamma function evaluated at @z.
+ */
gnm_complex
-gnm_complex_gamma (gnm_complex src)
+gnm_complex_gamma (gnm_complex z)
{
- if (GNM_CREALP (src)) {
- return GNM_CREAL (gnm_gamma (src.re));
- } else if (src.re < 0) {
+ if (GNM_CREALP (z)) {
+ return GNM_CREAL (gnm_gamma (z.re));
+ } else if (z.re < 0) {
/* Gamma(z) = pi / (sin(pi*z) * Gamma(-z+1)) */
- gnm_complex b = GNM_CMAKE (M_PIgnum * gnm_fmod (src.re, 2),
- M_PIgnum * src.im);
+ gnm_complex b = GNM_CMAKE (M_PIgnum * gnm_fmod (z.re, 2),
+ M_PIgnum * z.im);
/* Hmm... sin overflows when b.im is large. */
return GNM_CDIV (GNM_CREAL (M_PIgnum),
- GNM_CMUL (gnm_complex_fact (GNM_CNEG (src)), GNM_CSIN (b)));
+ GNM_CMUL (gnm_complex_fact (GNM_CNEG (z)), GNM_CSIN (b)));
} else {
gnm_complex zmh, f, p, q;
int i;
@@ -1269,13 +1275,13 @@ gnm_complex_gamma (gnm_complex src)
p = GNM_CREAL (lanczos_num[i]);
q = GNM_CREAL (lanczos_denom[i]);
while (--i >= 0) {
- p = GNM_CMUL (p, src);
+ p = GNM_CMUL (p, z);
p.re += lanczos_num[i];
- q = GNM_CMUL (q, src);
+ q = GNM_CMUL (q, z);
q.re += lanczos_denom[i];
}
- zmh = GNM_CMAKE (src.re - 0.5, src.im);
+ zmh = GNM_CMAKE (z.re - 0.5, z.im);
f = GNM_CPOW (GNM_CADD (zmh, GNM_CREAL (lanczos_g)), GNM_CSCALE (zmh, 0.5));
return GNM_CMUL4 (f, GNM_CEXP (GNM_CNEG (zmh)), f, GNM_CDIV (p, q));
@@ -1284,15 +1290,21 @@ gnm_complex_gamma (gnm_complex src)
/* ------------------------------------------------------------------------- */
+/**
+ * gnm_complex_fact:
+ * @z: a complex number
+ *
+ * Returns: (transfer full): the factorial function evaluated at @z.
+ */
gnm_complex
-gnm_complex_fact (gnm_complex src)
+gnm_complex_fact (gnm_complex z)
{
- if (GNM_CREALP (src)) {
- return GNM_CREAL (gnm_fact (src.re));
+ if (GNM_CREALP (z)) {
+ return GNM_CREAL (gnm_fact (z.re));
} else {
// This formula is valid for all arguments except zero
// which we conveniently handled above.
- return GNM_CMUL (gnm_complex_gamma (src), src);
+ return GNM_CMUL (gnm_complex_gamma (z), z);
}
}
@@ -1506,6 +1518,16 @@ fixup_upper_real (gnm_complex *res, gnm_complex a, gnm_complex z)
}
}
+/**
+ * gnm_complex_igamma:
+ * @a: a complex number
+ * @z: a complex number
+ * @lower: determines if upper or lower incomplete gamma is desired.
+ * @regularized: determines if the result should be normalized by Gamma(@a).
+ *
+ * Returns: (transfer full): the incomplete gamma function evaluated at
+ * @a and @z.
+ */
gnm_complex
gnm_complex_igamma (gnm_complex a, gnm_complex z,
gboolean lower, gboolean regularized)
diff --git a/src/sf-gamma.h b/src/sf-gamma.h
index cb0c85e..bfee0b7 100644
--- a/src/sf-gamma.h
+++ b/src/sf-gamma.h
@@ -10,8 +10,8 @@ gnm_float stirlerr(gnm_float n);
gnm_float gnm_gamma (gnm_float x);
gnm_float gnm_fact (gnm_float x);
int qfactf (gnm_float x, GnmQuad *mant, int *exp2);
-gnm_complex gnm_complex_gamma (gnm_complex src);
-gnm_complex gnm_complex_fact (gnm_complex src);
+gnm_complex gnm_complex_gamma (gnm_complex z);
+gnm_complex gnm_complex_fact (gnm_complex z);
gnm_complex gnm_complex_igamma (gnm_complex a, gnm_complex z,
gboolean lower, gboolean regularized);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]