The GSL special functions are each supposed to have two alternative
functional interfaces, a pure one:
double function(x, ...)
and one allowing for full error returns:
int function_e(x, ... gsl_sf_result * result)
But the Mathieu function code doesn't follow this convention.
It doesn't offer the former interface at all and uses the second
convention for all its functions BUT without the '_e' name extension on
its function declarations.
This is quite error prone since it is easy to assume that *gsl_sf_result
is simply a reference to a double when in fact it is a structure that is
longer than this (a library user on Windows made exactly this mistake
and wondered why his code was causing an illegal access exception).
I am doubtful that this is an intentional feature of the Mathieu
function code so I have created the attached patch to update the code to
use the normal conventions of the GSL special functions. (this needs
testing since I have only tried it on WIndows).
If this is adopted, the documentation will need updating as well
(unfortunately I am unable to do this).
with my best regards,
Brian Gladman
Left file:
C:\Users\brian\AppData\Local\Temp\qbzr\bzr-diff-kryjkr\1\specfunc\gsl_sf_mathieu.h
Right file: C:\Users\brian\Documents\Visual Studio
2013\Projects\gsl\specfunc\gsl_sf_mathieu.h
70,71c70,73
< int gsl_sf_mathieu_a(int order, double qq, gsl_sf_result *result);
< int gsl_sf_mathieu_b(int order, double qq, gsl_sf_result *result);
---
> int gsl_sf_mathieu_a_e(int order, double qq, gsl_sf_result *result);
> double gsl_sf_mathieu_a(int order, double qq);
> int gsl_sf_mathieu_b_e(int order, double qq, gsl_sf_result *result);
> double gsl_sf_mathieu_b(int order, double qq);
83,84c85,88
< int gsl_sf_mathieu_ce(int order, double qq, double zz, gsl_sf_result *result);
< int gsl_sf_mathieu_se(int order, double qq, double zz, gsl_sf_result *result);
---
> int gsl_sf_mathieu_ce_e(int order, double qq, double zz, gsl_sf_result
> *result);
> double gsl_sf_mathieu_ce(int order, double qq, double zz);
> int gsl_sf_mathieu_se_e(int order, double qq, double zz, gsl_sf_result
> *result);
> double gsl_sf_mathieu_se(int order, double qq, double zz);
93c97
< int gsl_sf_mathieu_Mc(int kind, int order, double qq, double zz,
---
> int gsl_sf_mathieu_Mc_e(int kind, int order, double qq, double zz,
95c99,100
< int gsl_sf_mathieu_Ms(int kind, int order, double qq, double zz,
---
> double gsl_sf_mathieu_Mc(int kind, int order, double qq, double zz);
> int gsl_sf_mathieu_Ms_e(int kind, int order, double qq, double zz,
96a102
> double gsl_sf_mathieu_Ms(int kind, int order, double qq, double zz);
Left file:
C:\Users\brian\AppData\Local\Temp\qbzr\bzr-diff-kryjkr\1\specfunc\mathieu_charv.c
Right file: C:\Users\brian\Documents\Visual Studio
2013\Projects\gsl\specfunc\mathieu_charv.c
370c370
< int gsl_sf_mathieu_a(int order, double qq, gsl_sf_result *result)
---
> int gsl_sf_mathieu_a_e(int order, double qq, gsl_sf_result *result)
398c398
< return gsl_sf_mathieu_a(order, -qq, result);
---
> return gsl_sf_mathieu_a_e(order, -qq, result);
400c400
< return gsl_sf_mathieu_b(order, -qq, result);
---
> return gsl_sf_mathieu_b_e(order, -qq, result);
496c496
< int gsl_sf_mathieu_b(int order, double qq, gsl_sf_result *result)
---
> int gsl_sf_mathieu_b_e(int order, double qq, gsl_sf_result *result)
530c530
< return gsl_sf_mathieu_b(order, -qq, result);
---
> return gsl_sf_mathieu_b_e(order, -qq, result);
532c532
< return gsl_sf_mathieu_a(order, -qq, result);
---
> return gsl_sf_mathieu_a_e(order, -qq, result);
875a876,889
>
> /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
>
> #include "eval.h"
>
> GSL_FUN double gsl_sf_mathieu_a(int order, double qq)
> {
> EVAL_RESULT(gsl_sf_mathieu_a_e(order, qq, &result));
> }
>
> GSL_FUN double gsl_sf_mathieu_b(int order, double qq)
> {
> EVAL_RESULT(gsl_sf_mathieu_b_e(order, qq, &result));
> }
Left file:
C:\Users\brian\AppData\Local\Temp\qbzr\bzr-diff-kryjkr\1\specfunc\mathieu_angfunc.c
Right file: C:\Users\brian\Documents\Visual Studio
2013\Projects\gsl\specfunc\mathieu_angfunc.c
30c30
< int gsl_sf_mathieu_ce(int order, double qq, double zz, gsl_sf_result *result)
---
> int gsl_sf_mathieu_ce_e(int order, double qq, double zz, gsl_sf_result
> *result)
66c66
< status = gsl_sf_mathieu_a(order, qq, &aa);
---
> status = gsl_sf_mathieu_a_e(order, qq, &aa);
112c112
< int gsl_sf_mathieu_se(int order, double qq, double zz, gsl_sf_result *result)
---
> int gsl_sf_mathieu_se_e(int order, double qq, double zz, gsl_sf_result
> *result)
152c152
< status = gsl_sf_mathieu_b(order, qq, &aa);
---
> status = gsl_sf_mathieu_b_e(order, qq, &aa);
350a351,364
>
> /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
>
> #include "eval.h"
>
> GSL_FUN double gsl_sf_mathieu_ce(int order, double qq, double zz)
> {
> EVAL_RESULT(gsl_sf_mathieu_ce_e(order, qq, zz, &result));
> }
>
> GSL_FUN double gsl_sf_mathieu_se(int order, double qq, double zz)
> {
> EVAL_RESULT(gsl_sf_mathieu_se_e(order, qq, zz, &result));
> }
Left file:
C:\Users\brian\AppData\Local\Temp\qbzr\bzr-diff-kryjkr\1\specfunc\mathieu_radfunc.c
Right file: C:\Users\brian\Documents\Visual Studio
2013\Projects\gsl\specfunc\mathieu_radfunc.c
30c30
< int gsl_sf_mathieu_Mc(int kind, int order, double qq, double zz,
---
> int gsl_sf_mathieu_Mc_e(int kind, int order, double qq, double zz,
62c62
< status = gsl_sf_mathieu_a(order, qq, &aa);
---
> status = gsl_sf_mathieu_a_e(order, qq, &aa);
136c136
< int gsl_sf_mathieu_Ms(int kind, int order, double qq, double zz,
---
> int gsl_sf_mathieu_Ms_e(int kind, int order, double qq, double zz,
176c176
< status = gsl_sf_mathieu_b(order, qq, &aa);
---
> status = gsl_sf_mathieu_b_e(order, qq, &aa);
474a475,488
>
> /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
>
> #include "eval.h"
>
> GSL_FUN double gsl_sf_mathieu_Mc(int kind, int order, double qq, double zz)
> {
> EVAL_RESULT(gsl_sf_mathieu_Mc_e(kind, order, qq, zz, &result));
> }
>
> GSL_FUN double gsl_sf_mathieu_Ms(int kind, int order, double qq, double zz)
> {
> EVAL_RESULT(gsl_sf_mathieu_Ms_e(kind, order, qq, zz, &result));
> }
Left file:
C:\Users\brian\AppData\Local\Temp\qbzr\bzr-diff-cav0a0\1\specfunc\test_mathieu.c
Right file: C:\Users\brian\Documents\Visual Studio
2013\Projects\gsl\specfunc\test_mathieu.c
37c37
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 0.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 0.0, 0.0, &r),
39c39
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 0.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 0.0, M_PI_2, &r),
41c41
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 5.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 5.0, 0.0, &r),
43c43
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 5.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 5.0, M_PI_2, &r),
45c45
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 10.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 10.0, 0.0, &r),
47c47
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 10.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 10.0, M_PI_2, &r),
49c49
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 15.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 15.0, 0.0, &r),
51c51
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 15.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 15.0, M_PI_2, &r),
53c53
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 20.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 20.0, 0.0, &r),
55c55
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 20.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 20.0, M_PI_2, &r),
57c57
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 25.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 25.0, 0.0, &r),
59c59
< TEST_SF(s, gsl_sf_mathieu_ce, (0, 25.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 25.0, M_PI_2, &r),
61c61
< TEST_SF(s, gsl_sf_mathieu_ce, (1, 0.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 0.0, 0.0, &r),
63c63
< TEST_SF(s, gsl_sf_mathieu_ce, (1, 5.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 5.0, 0.0, &r),
65c65
< TEST_SF(s, gsl_sf_mathieu_ce, (1, 10.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 10.0, 0.0, &r),
67c67
< TEST_SF(s, gsl_sf_mathieu_ce, (1, 15.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 15.0, 0.0, &r),
69c69
< TEST_SF(s, gsl_sf_mathieu_ce, (1, 20.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 20.0, 0.0, &r),
71c71
< TEST_SF(s, gsl_sf_mathieu_ce, (1, 25.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 25.0, 0.0, &r),
73c73
< TEST_SF(s, gsl_sf_mathieu_se, (1, 0.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (1, 0.0, M_PI_2, &r),
75c75
< TEST_SF(s, gsl_sf_mathieu_se, (1, 5.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (1, 5.0, M_PI_2, &r),
77c77
< TEST_SF(s, gsl_sf_mathieu_se, (1, 10.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (1, 10.0, M_PI_2, &r),
79c79
< TEST_SF(s, gsl_sf_mathieu_se, (1, 15.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (1, 15.0, M_PI_2, &r),
81c81
< TEST_SF(s, gsl_sf_mathieu_se, (1, 20.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (1, 20.0, M_PI_2, &r),
83c83
< TEST_SF(s, gsl_sf_mathieu_se, (1, 25.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (1, 25.0, M_PI_2, &r),
85c85
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 0.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 0.0, 0.0, &r),
87c87
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 0.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 0.0, M_PI_2, &r),
89c89
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 5.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 5.0, 0.0, &r),
91c91
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 5.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 5.0, M_PI_2, &r),
93c93
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 10.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 10.0, 0.0, &r),
95c95
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 10.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 10.0, M_PI_2, &r),
97c97
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 15.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 15.0, 0.0, &r),
99c99
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 15.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 15.0, M_PI_2, &r),
101c101
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 20.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 20.0, 0.0, &r),
103c103
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 20.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 20.0, M_PI_2, &r),
105c105
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 25.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 25.0, 0.0, &r),
107c107
< TEST_SF(s, gsl_sf_mathieu_ce, (2, 25.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 25.0, M_PI_2, &r),
109c109
< TEST_SF(s, gsl_sf_mathieu_ce, (5, 0.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 0.0, 0.0, &r),
111c111
< TEST_SF(s, gsl_sf_mathieu_ce, (5, 5.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 5.0, 0.0, &r),
113c113
< TEST_SF(s, gsl_sf_mathieu_ce, (5, 10.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 10.0, 0.0, &r),
115c115
< TEST_SF(s, gsl_sf_mathieu_ce, (5, 15.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 15.0, 0.0, &r),
117c117
< TEST_SF(s, gsl_sf_mathieu_ce, (5, 20.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 20.0, 0.0, &r),
119c119
< TEST_SF(s, gsl_sf_mathieu_ce, (5, 25.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 25.0, 0.0, &r),
121c121
< TEST_SF(s, gsl_sf_mathieu_se, (5, 0.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (5, 0.0, M_PI_2, &r),
123c123
< TEST_SF(s, gsl_sf_mathieu_se, (5, 5.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (5, 5.0, M_PI_2, &r),
125c125
< TEST_SF(s, gsl_sf_mathieu_se, (5, 10.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (5, 10.0, M_PI_2, &r),
127c127
< TEST_SF(s, gsl_sf_mathieu_se, (5, 15.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (5, 15.0, M_PI_2, &r),
129c129
< TEST_SF(s, gsl_sf_mathieu_se, (5, 20.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (5, 20.0, M_PI_2, &r),
131c131
< TEST_SF(s, gsl_sf_mathieu_se, (5, 25.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (5, 25.0, M_PI_2, &r),
133c133
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 0.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 0.0, 0.0, &r),
135c135
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 0.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 0.0, M_PI_2, &r),
137c137
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 5.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 5.0, 0.0, &r),
139c139
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 5.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 5.0, M_PI_2, &r),
141c141
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 10.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 10.0, 0.0, &r),
143c143
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 10.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 10.0, M_PI_2, &r),
145c145
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 15.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 15.0, 0.0, &r),
147c147
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 15.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 15.0, M_PI_2, &r),
149c149
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 20.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 20.0, 0.0, &r),
151c151
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 20.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 20.0, M_PI_2, &r),
153c153
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 25.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 25.0, 0.0, &r),
155c155
< TEST_SF(s, gsl_sf_mathieu_ce, (10, 25.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 25.0, M_PI_2, &r),
157c157
< TEST_SF(s, gsl_sf_mathieu_ce, (15, 0.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 0.0, 0.0, &r),
159c159
< TEST_SF(s, gsl_sf_mathieu_ce, (15, 5.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 5.0, 0.0, &r),
161c161
< TEST_SF(s, gsl_sf_mathieu_ce, (15, 10.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 10.0, 0.0, &r),
163c163
< TEST_SF(s, gsl_sf_mathieu_ce, (15, 15.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 15.0, 0.0, &r),
165c165
< TEST_SF(s, gsl_sf_mathieu_ce, (15, 20.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 20.0, 0.0, &r),
167c167
< TEST_SF(s, gsl_sf_mathieu_ce, (15, 25.0, 0.0, &r),
---
> TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 25.0, 0.0, &r),
169c169
< TEST_SF(s, gsl_sf_mathieu_se, (15, 0.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (15, 0.0, M_PI_2, &r),
171c171
< TEST_SF(s, gsl_sf_mathieu_se, (15, 5.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (15, 5.0, M_PI_2, &r),
173c173
< TEST_SF(s, gsl_sf_mathieu_se, (15, 10.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (15, 10.0, M_PI_2, &r),
175c175
< TEST_SF(s, gsl_sf_mathieu_se, (15, 15.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (15, 15.0, M_PI_2, &r),
177c177
< TEST_SF(s, gsl_sf_mathieu_se, (15, 20.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (15, 20.0, M_PI_2, &r),
179c179
< TEST_SF(s, gsl_sf_mathieu_se, (15, 25.0, M_PI_2, &r),
---
> TEST_SF(s, gsl_sf_mathieu_se_e, (15, 25.0, M_PI_2, &r),