1use std::f64;23use jrsonnet_evaluator::{function::builtin, typed::PositiveF64};45#[builtin]6pub fn builtin_abs(n: f64) -> f64 {7 n.abs()8}910#[builtin]11pub fn builtin_sign(n: f64) -> f64 {12 if n == 0. {13 0.14 } else {15 n.signum()16 }17}1819#[builtin]20pub fn builtin_max(a: f64, b: f64) -> f64 {21 a.max(b)22}2324#[builtin]25pub fn builtin_min(a: f64, b: f64) -> f64 {26 a.min(b)27}2829#[allow(non_snake_case)]30#[builtin]31pub fn builtin_clamp(x: f64, minVal: f64, maxVal: f64) -> f64 {32 x.clamp(minVal, maxVal)33}3435#[builtin]36pub fn builtin_sum(arr: Vec<f64>) -> f64 {37 arr.iter().sum()38}3940#[builtin]41pub fn builtin_modulo(x: f64, y: f64) -> f64 {42 x % y43}4445#[builtin]46pub fn builtin_floor(x: f64) -> f64 {47 x.floor()48}4950#[builtin]51pub fn builtin_ceil(x: f64) -> f64 {52 x.ceil()53}5455#[builtin]56pub fn builtin_log(x: f64) -> f64 {57 x.ln()58}5960#[builtin]61pub fn builtin_log2(x: f64) -> f64 {62 x.log2()63}6465#[builtin]66pub fn builtin_log10(x: f64) -> f64 {67 x.log10()68}6970#[builtin]71pub fn builtin_pow(x: f64, n: f64) -> f64 {72 x.powf(n)73}7475#[builtin]76pub fn builtin_sqrt(x: PositiveF64) -> f64 {77 x.0.sqrt()78}7980#[builtin]81pub fn builtin_sin(x: f64) -> f64 {82 x.sin()83}8485#[builtin]86pub fn builtin_cos(x: f64) -> f64 {87 x.cos()88}8990#[builtin]91pub fn builtin_tan(x: f64) -> f64 {92 x.tan()93}9495#[builtin]96pub fn builtin_asin(x: f64) -> f64 {97 x.asin()98}99100#[builtin]101pub fn builtin_acos(x: f64) -> f64 {102 x.acos()103}104105#[builtin]106pub fn builtin_atan(x: f64) -> f64 {107 x.atan()108}109110#[builtin]111pub fn builtin_atan2(y: f64, x: f64) -> f64 {112 y.atan2(x)113}114115#[builtin]116pub fn builtin_exp(x: f64) -> f64 {117 x.exp()118}119120fn frexp(s: f64) -> (f64, i16) {121 if s == 0.0 {122 (s, 0)123 } else {124 let lg = s.abs().log2();125 let x = (lg - lg.floor() - 1.0).exp2();126 let exp = lg.floor() + 1.0;127 (s.signum() * x, exp as i16)128 }129}130131#[builtin]132pub fn builtin_mantissa(x: f64) -> f64 {133 frexp(x).0134}135136#[builtin]137pub fn builtin_exponent(x: f64) -> i16 {138 frexp(x).1139}140141#[builtin]142pub fn builtin_round(x: f64) -> f64 {143 x.round()144}145146#[builtin]147pub fn builtin_is_even(x: f64) -> bool {148 builtin_round(x) % 2.0 == 0.0149}150151#[builtin]152#[allow(clippy::float_cmp)]153pub fn builtin_is_odd(x: f64) -> bool {154 builtin_round(x) % 2.0 == 1.0155}156157#[builtin]158#[allow(clippy::float_cmp)]159pub fn builtin_is_integer(x: f64) -> bool {160 builtin_round(x) == x161}162163#[builtin]164#[allow(clippy::float_cmp)]165pub fn builtin_is_decimal(x: f64) -> bool {166 builtin_round(x) != x167}168169#[builtin]170pub fn builtin_deg2rad(x: f64) -> f64 {171 x.to_radians()172}173174#[builtin]175pub fn builtin_rad2deg(x: f64) -> f64 {176 x.to_degrees()177}178179#[builtin]180pub fn builtin_hypot(x: f64, y: f64) -> f64 {181 x.hypot(y)182}