git.delta.rocks / jrsonnet / refs/commits / ff649630ca7e

difftreelog

source

crates/jrsonnet-stdlib/src/math.rs2.2 KiBsourcehistory
1use jrsonnet_evaluator::{error::Result, function::builtin, typed::PositiveF64};23#[builtin]4pub fn builtin_abs(x: f64) -> Result<f64> {5	Ok(x.abs())6}78#[builtin]9pub fn builtin_sign(x: f64) -> Result<f64> {10	Ok(if x == 0. { 0. } else { x.signum() })11}1213#[builtin]14pub fn builtin_max(x: f64, y: f64) -> Result<f64> {15	Ok(x.max(y))16}1718#[builtin]19pub fn builtin_min(x: f64, y: f64) -> Result<f64> {20	Ok(x.min(y))21}2223#[builtin]24pub fn builtin_clamp(x: f64, min_val: f64, max_val: f64) -> Result<f64> {25	debug_assert!(x.is_finite(), "jsonnet number are always finite");26	debug_assert!(min_val.is_finite(), "jsonnet number are always finite");27	debug_assert!(max_val.is_finite(), "jsonnet number are always finite");2829	// `f64::clamp` should noe be used here since it requires extra checks to guarantee NaN-safety30	Ok(if x < min_val {31		min_val32	} else if x > max_val {33		max_val34	} else {35		x36	})37}3839#[builtin]40pub fn builtin_modulo(a: f64, b: f64) -> Result<f64> {41	Ok(a % b)42}4344#[builtin]45pub fn builtin_floor(x: f64) -> Result<f64> {46	Ok(x.floor())47}4849#[builtin]50pub fn builtin_ceil(x: f64) -> Result<f64> {51	Ok(x.ceil())52}5354#[builtin]55pub fn builtin_log(n: f64) -> Result<f64> {56	Ok(n.ln())57}5859#[builtin]60pub fn builtin_pow(x: f64, n: f64) -> Result<f64> {61	Ok(x.powf(n))62}6364#[builtin]65pub fn builtin_sqrt(x: PositiveF64) -> Result<f64> {66	Ok(x.0.sqrt())67}6869#[builtin]70pub fn builtin_sin(x: f64) -> Result<f64> {71	Ok(x.sin())72}7374#[builtin]75pub fn builtin_cos(x: f64) -> Result<f64> {76	Ok(x.cos())77}7879#[builtin]80pub fn builtin_tan(x: f64) -> Result<f64> {81	Ok(x.tan())82}8384#[builtin]85pub fn builtin_asin(x: f64) -> Result<f64> {86	Ok(x.asin())87}8889#[builtin]90pub fn builtin_acos(x: f64) -> Result<f64> {91	Ok(x.acos())92}9394#[builtin]95pub fn builtin_atan(x: f64) -> Result<f64> {96	Ok(x.atan())97}9899#[builtin]100pub fn builtin_exp(x: f64) -> Result<f64> {101	Ok(x.exp())102}103104fn frexp(s: f64) -> (f64, i16) {105	if s == 0.0 {106		(s, 0)107	} else {108		let lg = s.abs().log2();109		let x = (lg - lg.floor() - 1.0).exp2();110		let exp = lg.floor() + 1.0;111		(s.signum() * x, exp as i16)112	}113}114115#[builtin]116pub fn builtin_mantissa(x: f64) -> Result<f64> {117	Ok(frexp(x).0)118}119120#[builtin]121pub fn builtin_exponent(x: f64) -> Result<i16> {122	Ok(frexp(x).1)123}