seq-compiler 5.4.1

Compiler for the Seq programming language
Documentation
# Float Math Standard Library for Seq
#
# Common mathematical operations for floating-point arithmetic.
#
# ## Usage
#
#   include std:fmath
#
#   : main ( -- Int )
#     -5.0 f.abs float->string io.write-line
#     0
#   ;
#
# ## Available Functions
#
# - f.abs: ( Float -- Float ) - Absolute value
# - f.max: ( Float Float -- Float ) - Maximum of two values
# - f.min: ( Float Float -- Float ) - Minimum of two values
# - f.sign: ( Float -- Float ) - Sign function: returns -1.0, 0.0, or 1.0
# - f.square: ( Float -- Float ) - Square a number
# - f.clamp: ( Float Float Float -- Float ) - Clamp value between min and max
# - f.neg: ( Float -- Float ) - Negate a float
#
# ## Notes
#
# - All operations use IEEE 754 double precision (f64)
# - NaN and Infinity follow IEEE 754 semantics
#
# ## Examples
#
#   -3.14 f.abs        # Returns 3.14
#   2.5 3.7 f.max      # Returns 3.7
#   1.5 f.square       # Returns 2.25
#   15.0 0.0 10.0 f.clamp  # Returns 10.0 (clamped to max)
#

# Absolute value for floats
: f.abs ( Float -- Float )
  dup dup 0.0 f.< if
    nip 0.0 swap f.subtract
  else
    drop
  then
;

# Maximum of two float values
: f.max ( Float Float -- Float )
  2dup f.> if
    drop
  else
    nip
  then
;

# Minimum of two float values
: f.min ( Float Float -- Float )
  2dup f.< if
    drop
  else
    nip
  then
;

# Sign function: returns -1.0, 0.0, or 1.0
: f.sign ( Float -- Float )
  dup 0.0 f.= if
    drop 0.0
  else
    dup 0.0 f.< if
      drop -1.0
    else
      drop 1.0
    then
  then
;

# Square a float
: f.square ( Float -- Float )
  dup f.multiply
;

# Negate a float
: f.neg ( Float -- Float )
  0.0 swap f.subtract
;

# Clamp value between min and max
# Stack: ( value min max -- clamped )
# Returns: min if value < min, max if value > max, else value
: f.clamp ( Float Float Float -- Float )
  # Stack: value min max
  rot rot
  # Stack: max value min
  2dup f.< if
    # value < min, return min
    nip nip
  else
    # value >= min
    drop
    # Stack: max value
    2dup f.> if
      # value > max, return max
      nip
    else
      # min <= value <= max, return value
      drop
    then
  then
;