1
0
Fork 0
forked from fun/fun
fun/lib/math.fun

90 lines
1.4 KiB
Standard ML

/*
* This file is part of the Fun programming language.
* https://fun-lang.xyz/
*
* Copyright 2025 Johannes Findeisen
* Licensed under the terms of the Apache-2.0 license.
* https://opensource.org/license/apache-2-0
*
* Added: 2025-10-01
*/
// Math helpers
fun abs(x)
if (x < 0)
return -x
return x
fun clamp(x, lo, hi)
v = x
if (v < lo) v = lo
if (v > hi) v = hi
return v
fun gcd(a, b)
number x = abs(a)
number y = abs(b)
while y != 0
t = x % y
x = y
y = t
return x
fun lcm(a, b)
if (a == 0) || (b == 0)
return 0
return abs(a * b) / gcd(a, b)
// integer exponent (exp >= 0)
fun powi(base, exp)
number e = exp
if (e < 0)
// simple fallback for negative: 0 for now (no floats)
return 0
number result = 1
number b = base
while e > 0
if (e % 2 == 1)
result = result * b
b = b * b
e = e / 2
return result
// Min/Max over three numbers
fun min3(a, b, c)
m = a
if (b < m) m = b
if (c < m) m = c
return m
fun max3(a, b, c)
m = a
if (b > m) m = b
if (c > m) m = c
return m
// Array min/max (for non-empty arrays)
fun array_min(arr)
number n = len(arr)
if (n == 0)
return 0
m = arr[0]
number i = 1
while i < n
if (arr[i] < m)
m = arr[i]
i = i + 1
return m
fun array_max(arr)
number n = len(arr)
if (n == 0)
return 0
m = arr[0]
number i = 1
while i < n
if (arr[i] > m)
m = arr[i]
i = i + 1
return m