package Std::Math {
  native sub INFINITYF : float ();
  native sub NANF : float ();
  
  native sub isinff : int($x : float);
  native sub isfinitef : int($x : float);
  native sub isnanf : int ($x : float);
  
  native sub INFINITY : double ();
  native sub NAN : double ();
  
  native sub isinf : int ($x : double);
  native sub isfinite : int ($x : double);
  native sub isnan : int ($x : double);

  sub PI : double () { return 3.14159265358979323846; }
  sub E : double () { return 2.7182818284590452354; }
  
  # Trigonometric functions
  native sub acos : double ($x : double);
  native sub asin : double($x : double);
  native sub atan : double ($x : double);
  native sub atan2 : double ($y : double, $x : double);
  native sub cos : double ($x : double);
  native sub sin : double ($x : double);
  native sub tan : double ($x : double);
  
  # Hyperbolic functions
  native sub acosh : double ($x : double);
  native sub asinh : double ($x : double);
  native sub atanh : double ($x : double);
  native sub cosh : double ($x : double);
  native sub sinh : double ($x : double);
  native sub tanh : double ($x : double);
  
  # Exponential functions and logarithmic functions
  native sub exp : double ($x : double);
  native sub exp2 : double ($x : double);
  native sub expm1 : double ($x : double);
  native sub log : double ($x : double);
  native sub log10 : double ($x : double);
  native sub log1p : double ($x : double);
  
  # Exponentiation functions and Absolute value functions
  native sub abs : int ($x : int);
  native sub labs : long ($x : long);
  native sub cbrt : double ($x : double);
  native sub fabs : double ($x : double);
  native sub hypot : double ($x : double, $y : double);
  native sub pow : double ($x : double, $y : double);
  native sub sqrt : double ($x : double);
  
  # Error function and Gamma function
  native sub erf : double ($x : double);
  native sub erfc : double ($x : double);
  native sub lgamma : double ($x : double);
  native sub tgamma : double ($x : double);

  # Nearest integer function
  native sub ceil : double ($x : double);
  native sub floor : double ($x : double);
  native sub nearbyint : double ($x : double);
  native sub round : double ($x : double);
  
  # Surplus functions
  native sub remainder : double ($x1 : double, $x2 : double);
}