- '%' => [2, sub {$val[0] /= shift(@stack)}], # percentage
- '%ch' => [2, sub {$val[0] = 100*(shift(@stack)-$val[0])/$val[0]}], # percentage change
- '%t' => [2, sub {$val[0] = 100*$val[0]/shift(@stack)}], # percentage total
-
- 'and' => [2, sub {$val[0] = shift(@stack) & $val[0]}], # bitwise and
- 'or' => [2, sub {$val[0] = shift(@stack) | $val[0]}], # bitwise or
- 'xor' => [2, sub {$val[0] = shift(@stack) ^ $val[0]}], # bitwise xor
- 'not' => [2, sub {$val[0] = ~$val[0]}], # bitwise not
-
- 'abs' => [1, sub {$val[0] = abs $val[0]}], # absolute #todo
- 'sign' => [1, sub {$val[0] = $val[0] <=> 0}], # sign
- 'ip' => [1, sub {$val[0] = int $val[0]}], # integer part
- 'fp' => [1, sub {$val[0] -= int $val[0]}], # fractional part
-
- 'rnd' => [1, sub {local $_ = 10**shift @stack; $val[0] = int(($val[0]+.5)*$_)/$_}], # round
- 'trnc' => [1, sub {local $_ = 10**shift @stack; $val[0] = int($val[0]*$_)/$_}], # truncate
- 'floor'=> [1, sub {$val[0] = int $val[0]}], # floor
- 'ceil' => [1, sub {$val[0] = int $val[0]+.9999}], # ceil
-
- 'min' => [2, sub {
- local $_ = shift @stack;
- $val[0] = $_ if $_<$val[0];
- }], # minimum
- 'max' => [2, sub {
- local $_ = shift @stack;
- $val[0] = $_ if $_>$val[0];
- }], # maximum
+ 'sinh' => [1, sub {$stack[0] = ( exp($stack[0]) - exp(-$stack[0]) )/2}], # hyperbolic sine
+ 'cosh' => [1, sub {$stack[0] = ( exp($stack[0]) + exp(-$stack[0]) )/2}], # hyperbolic cosine
+ 'tanh' => [1, sub {$stack[0] = ( exp($stack[0]) - exp(-$stack[0]) )/( exp($stack[0]) + exp(-$stack[0]) )}], # hyperbolic tangent (sinh/cosh)
+ 'asinh'=> [1, sub {$stack[0] = log( sqrt($stack[0]**2+1)+$stack[0] )}], # inverse hyperbolic sine
+ 'acosh'=> [1, sub {$stack[0] = log( sqrt($stack[0]**2-1)+$stack[0] )}], # inverse hyperbolic cosine
+ 'atanh'=> [1, sub {$stack[0] = log( (1+$stack[0]) / (1-$stack[0]) )/2}], # inverse hyperbolic tangent
+
+ '%' => [2, sub {$stack[0] /= shift @stack}], # percentage
+ '%ch' => [2, sub {$val{i} = 100*(shift(@stack)-$val{i})/$val{i}}], # percentage change
+ '%t' => [2, sub {$val{i} = 100*$val{i}/shift(@stack)}], # percentage total
+
+ 'and' => [2, sub {$stack[1] &= shift @stack}], # bitwise and
+ 'or' => [2, sub {$stack[1] |= shift @stack}], # bitwise or
+ 'xor' => [2, sub {$stack[1] ^= shift @stack}], # bitwise xor
+ 'not' => [2, sub {$stack[0] = ~$stack[0]}], # bitwise not
+ 'sl' => [1, sub {$stack[0] *= 2}], # shift left
+ 'sr' => [1, sub {$stack[0] /= 2}], # shift right
+
+ 'abs' => [1, sub {$stack[0] = abs $stack[0]}], # absolute #todo
+ 'sign' => [1, sub {$stack[0] = $stack[0] <=> 0}], # sign
+ 'ip' => [1, sub {$stack[0] = int $stack[0]}], # integer part
+ 'fp' => [1, sub {$stack[0] -= int $stack[0]}], # fractional part
+
+ 'rnd' => [1, sub {local $_ = 10**shift @stack; $val{i} = int(($val{i}+.5)*$_)/$_}], # round
+ 'trnc' => [1, sub {local $_ = 10**shift @stack; $val{i} = int($val{i}*$_)/$_}], # truncate
+ 'floor'=> [1, sub {$stack[0] = int $stack[0]}], # floor
+ 'ceil' => [1, sub {$stack[0] = int $stack[0]+.9999}], # ceil
+
+ 'min' => [2, sub {local $_ = shift @stack; $stack[0] = $_ if $_<$stack[0] }], # minimum
+ 'max' => [2, sub {local $_ = shift @stack; $stack[0] = $_ if $_>$stack[0] }], # maximum