File: mlgsl_complex.c

package info (click to toggle)
ocamlgsl 0.6.0-7
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, squeeze, wheezy
  • size: 4,028 kB
  • ctags: 3,090
  • sloc: ml: 8,539; ansic: 7,338; makefile: 261; sh: 149; awk: 13
file content (96 lines) | stat: -rw-r--r-- 2,332 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/* ocamlgsl - OCaml interface to GSL                        */
/* Copyright (©) 2003 - Paul Pelzl                          */
/* distributed under the terms of the GPL version 2         */

#include <caml/alloc.h>
#include <gsl/gsl_complex_math.h>
#include "mlgsl_complex.h"


#define _COMPLEX_HANDLER(funct) \
  CAMLprim value ml_gsl_complex_##funct(value Z) { \
    _DECLARE_COMPLEX2(Z,temp); \
    _CONVERT_COMPLEX(Z); \
    z_temp = gsl_complex_##funct(z_Z); \
    return copy_complex(&z_temp); \
  }


#define _COMPLEX_HANDLER2(funct) \
  CAMLprim value ml_gsl_complex_##funct(value Z, value A) { \
    _DECLARE_COMPLEX3(Z, A, temp); \
    _CONVERT_COMPLEX2(Z, A); \
    z_temp = gsl_complex_##funct(z_Z, z_A); \
    return copy_complex(&z_temp); \
  }


#define _COMPLEX_HANDLER_DOUBLE(funct) \
  CAMLprim value ml_gsl_complex_##funct(value X) { \
    gsl_complex temp; \
    temp = gsl_complex_##funct(Double_val(X)); \
    return copy_complex(&temp); \
  }


/* properties of complex numbers */
CAMLprim value ml_gsl_complex_logabs(value Z)
{
  _DECLARE_COMPLEX(Z);
  _CONVERT_COMPLEX(Z);
  return copy_double(gsl_complex_logabs(z_Z));
}


_COMPLEX_HANDLER(sqrt)
_COMPLEX_HANDLER_DOUBLE(sqrt_real)
_COMPLEX_HANDLER2(pow)


CAMLprim value ml_gsl_complex_pow_real(value Z, value X)
{
  _DECLARE_COMPLEX2(Z, temp);
  _CONVERT_COMPLEX(Z);
  z_temp = gsl_complex_pow_real(z_Z, Double_val(X));
  return copy_complex(&z_temp);
}

  
_COMPLEX_HANDLER(exp)
_COMPLEX_HANDLER(log)
_COMPLEX_HANDLER(log10)
_COMPLEX_HANDLER2(log_b)

_COMPLEX_HANDLER(sin)
_COMPLEX_HANDLER(cos)
_COMPLEX_HANDLER(tan)
_COMPLEX_HANDLER(sec)
_COMPLEX_HANDLER(csc)
_COMPLEX_HANDLER(cot)

_COMPLEX_HANDLER(arcsin)
_COMPLEX_HANDLER_DOUBLE(arcsin_real)
_COMPLEX_HANDLER(arccos)
_COMPLEX_HANDLER_DOUBLE(arccos_real)
_COMPLEX_HANDLER(arctan)
_COMPLEX_HANDLER(arcsec)
_COMPLEX_HANDLER_DOUBLE(arcsec_real)
_COMPLEX_HANDLER(arccsc)
_COMPLEX_HANDLER_DOUBLE(arccsc_real)
_COMPLEX_HANDLER(arccot)

_COMPLEX_HANDLER(sinh)
_COMPLEX_HANDLER(cosh)
_COMPLEX_HANDLER(tanh)
_COMPLEX_HANDLER(sech)
_COMPLEX_HANDLER(csch)
_COMPLEX_HANDLER(coth)

_COMPLEX_HANDLER(arcsinh)
_COMPLEX_HANDLER(arccosh)
_COMPLEX_HANDLER_DOUBLE(arccosh_real)
_COMPLEX_HANDLER(arctanh)
_COMPLEX_HANDLER_DOUBLE(arctanh_real)
_COMPLEX_HANDLER(arcsech)
_COMPLEX_HANDLER(arccsch)
_COMPLEX_HANDLER(arccoth)