rgsl/
exponential_integrals.rs

1//
2// A rust binding for the GSL library by Guillaume Gomez (guillaume1.gomez@gmail.com)
3//
4
5use crate::{types, Value};
6use std::mem::MaybeUninit;
7
8/// This routine computes the exponential integral E_1(x),
9///
10/// E_1(x) := \Re \int_1^\infty dt \exp(-xt)/t.
11#[doc(alias = "gsl_sf_expint_E1")]
12pub fn E1(x: f64) -> f64 {
13    unsafe { sys::gsl_sf_expint_E1(x) }
14}
15
16/// This routine computes the exponential integral E_1(x),
17///
18/// E_1(x) := \Re \int_1^\infty dt \exp(-xt)/t.
19#[doc(alias = "gsl_sf_expint_E1_e")]
20pub fn E1_e(x: f64) -> Result<types::Result, Value> {
21    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
22    let ret = unsafe { sys::gsl_sf_expint_E1_e(x, result.as_mut_ptr()) };
23
24    result_handler!(ret, unsafe { result.assume_init() }.into())
25}
26
27/// This routine computes the second-order exponential integral E_2(x),
28///
29/// E_2(x) := \Re \int_1^\infty dt \exp(-xt)/t^2.
30#[doc(alias = "gsl_sf_expint_E2")]
31pub fn E2(x: f64) -> f64 {
32    unsafe { sys::gsl_sf_expint_E2(x) }
33}
34
35/// This routine computes the second-order exponential integral E_2(x),
36///
37/// E_2(x) := \Re \int_1^\infty dt \exp(-xt)/t^2.
38#[doc(alias = "gsl_sf_expint_E2_e")]
39pub fn E2_e(x: f64) -> Result<types::Result, Value> {
40    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
41    let ret = unsafe { sys::gsl_sf_expint_E2_e(x, result.as_mut_ptr()) };
42
43    result_handler!(ret, unsafe { result.assume_init() }.into())
44}
45
46/// This routine computes the exponential integral E_n(x) of order n,
47///
48/// E_n(x) := \Re \int_1^\infty dt \exp(-xt)/t^n.
49#[doc(alias = "gsl_sf_expint_En")]
50pub fn En(n: i32, x: f64) -> f64 {
51    unsafe { sys::gsl_sf_expint_En(n, x) }
52}
53
54/// This routine computes the exponential integral E_n(x) of order n,
55///
56/// E_n(x) := \Re \int_1^\infty dt \exp(-xt)/t^n.
57#[doc(alias = "gsl_sf_expint_En_e")]
58pub fn En_e(n: i32, x: f64) -> Result<types::Result, Value> {
59    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
60    let ret = unsafe { sys::gsl_sf_expint_En_e(n, x, result.as_mut_ptr()) };
61
62    result_handler!(ret, unsafe { result.assume_init() }.into())
63}
64
65/// This routine computes the exponential integral Ei(x),
66///
67/// Ei(x) := - PV(\int_{-x}^\infty dt \exp(-t)/t)
68///
69/// where PV denotes the principal value of the integral.
70#[doc(alias = "gsl_sf_expint_Ei")]
71pub fn Ei(x: f64) -> f64 {
72    unsafe { sys::gsl_sf_expint_Ei(x) }
73}
74
75/// This routine computes the exponential integral Ei(x),
76///
77/// Ei(x) := - PV(\int_{-x}^\infty dt \exp(-t)/t)
78///
79/// where PV denotes the principal value of the integral.
80#[doc(alias = "gsl_sf_expint_Ei_e")]
81pub fn Ei_e(x: f64) -> Result<types::Result, Value> {
82    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
83    let ret = unsafe { sys::gsl_sf_expint_Ei_e(x, result.as_mut_ptr()) };
84
85    result_handler!(ret, unsafe { result.assume_init() }.into())
86}
87
88/// This routine computes the integral Shi(x) = \int_0^x dt \sinh(t)/t.
89#[doc(alias = "gsl_sf_Shi")]
90pub fn Shi(x: f64) -> f64 {
91    unsafe { sys::gsl_sf_Shi(x) }
92}
93
94/// This routine computes the integral Shi(x) = \int_0^x dt \sinh(t)/t.
95#[doc(alias = "gsl_sf_Shi_e")]
96pub fn Shi_e(x: f64) -> Result<types::Result, Value> {
97    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
98    let ret = unsafe { sys::gsl_sf_Shi_e(x, result.as_mut_ptr()) };
99
100    result_handler!(ret, unsafe { result.assume_init() }.into())
101}
102
103/// This routine computes the integral Chi(x) := \Re[ \gamma_E + \log(x) + \int_0^x dt (\cosh(t)-1)/t] , where \gamma_E is the Euler constant (available as the macro M_EULER).
104#[doc(alias = "gsl_sf_Chi")]
105pub fn Chi(x: f64) -> f64 {
106    unsafe { sys::gsl_sf_Chi(x) }
107}
108
109/// This routine computes the integral Chi(x) := \Re[ \gamma_E + \log(x) + \int_0^x dt (\cosh(t)-1)/t] , where \gamma_E is the Euler constant (available as the macro M_EULER).
110#[doc(alias = "gsl_sf_Chi_e")]
111pub fn Chi_e(x: f64) -> Result<types::Result, Value> {
112    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
113    let ret = unsafe { sys::gsl_sf_Chi_e(x, result.as_mut_ptr()) };
114
115    result_handler!(ret, unsafe { result.assume_init() }.into())
116}
117
118/// This routine computes the third-order exponential integral Ei_3(x) = \int_0^xdt \exp(-t^3) for x >= 0.
119#[doc(alias = "gsl_sf_expint_3")]
120pub fn _3(x: f64) -> f64 {
121    unsafe { sys::gsl_sf_expint_3(x) }
122}
123
124/// This routine computes the third-order exponential integral Ei_3(x) = \int_0^xdt \exp(-t^3) for x >= 0.
125#[doc(alias = "gsl_sf_expint_3_e")]
126pub fn _3_e(x: f64) -> Result<types::Result, Value> {
127    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
128    let ret = unsafe { sys::gsl_sf_expint_3_e(x, result.as_mut_ptr()) };
129
130    result_handler!(ret, unsafe { result.assume_init() }.into())
131}
132
133/// This routine computes the Sine integral Si(x) = \int_0^x dt \sin(t)/t.
134#[doc(alias = "gsl_sf_Si")]
135pub fn Si(x: f64) -> f64 {
136    unsafe { sys::gsl_sf_Si(x) }
137}
138
139/// This routine computes the Sine integral Si(x) = \int_0^x dt \sin(t)/t.
140#[doc(alias = "gsl_sf_Si_e")]
141pub fn Si_e(x: f64) -> Result<types::Result, Value> {
142    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
143    let ret = unsafe { sys::gsl_sf_Si_e(x, result.as_mut_ptr()) };
144
145    result_handler!(ret, unsafe { result.assume_init() }.into())
146}
147
148/// This routine computes the Cosine integral Ci(x) = -\int_x^\infty dt \cos(t)/t for x > 0.
149#[doc(alias = "gsl_sf_Ci")]
150pub fn Ci(x: f64) -> f64 {
151    unsafe { sys::gsl_sf_Ci(x) }
152}
153
154/// This routine computes the Cosine integral Ci(x) = -\int_x^\infty dt \cos(t)/t for x > 0.
155#[doc(alias = "gsl_sf_Ci_e")]
156pub fn Ci_e(x: f64) -> Result<types::Result, Value> {
157    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
158    let ret = unsafe { sys::gsl_sf_Ci_e(x, result.as_mut_ptr()) };
159
160    result_handler!(ret, unsafe { result.assume_init() }.into())
161}
162
163/// This routine computes the Arctangent integral, which is defined as AtanInt(x) = \int_0^x dt \arctan(t)/t.
164#[doc(alias = "gsl_sf_atanint")]
165pub fn atanint(x: f64) -> f64 {
166    unsafe { sys::gsl_sf_atanint(x) }
167}
168
169/// This routine computes the Arctangent integral, which is defined as AtanInt(x) = \int_0^x dt \arctan(t)/t.
170#[doc(alias = "gsl_sf_atanint_e")]
171pub fn atanint_e(x: f64) -> Result<types::Result, Value> {
172    let mut result = MaybeUninit::<sys::gsl_sf_result>::uninit();
173    let ret = unsafe { sys::gsl_sf_atanint_e(x, result.as_mut_ptr()) };
174
175    result_handler!(ret, unsafe { result.assume_init() }.into())
176}