1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
use num::Float;
use numeric_literals::replace_numeric_literals;

#[replace_numeric_literals(T::from(literal).unwrap())]
#[inline]
pub fn fast_sigmoid<T: Float>(value: T) -> T {
    value / (1 + value.abs())
}

#[replace_numeric_literals(T::from(literal).unwrap())]
#[inline]
pub fn fast_tanh<T: Float>(x: T) -> T {
    if x.abs() >= 4.97 {
        let values = [-1, 1];
        return unsafe { *values.get_unchecked((x >= 0) as usize) };
    }
    let x2 = x * x;
    let a = x * (135135 + x2 * (17325 + x2 * (378 + x2)));
    let b = 135135 + x2 * (62370 + x2 * (3150 + x2 * 28));
    a / b
}