Predicates and functions in this group are used to perform arithmetic and string operations. String operations are further subdivided into operations on UTF-8 character strings, and operations on strings of raw bytes.
Predicates: is/2, (=:=)/2, (=!=)/2, (<)/2, (<=)/2, (>)/2, (>=)/2, atom_name/2, fperror/1, isnan/1, isinf/1, randomize/0, randomize/1
Mathematical operators: (+)/2, (-)/1, (-)/2, (*)/2, (/)/2, (%)/2, (**)/2, mod/2, rem/2
Mathematical functions: abs/1, ceil/1, exp/1, float_fractional_part/1, float_integer_part/1, floor/1, log/1, pow/2, round/1, sign/1, sqrt/1, truncate/1
Mathematical constants: e/0, inf/0, nan/0, pi/0
Trigonometric functions: acos/1, asin/1, atan/1, atan2/2, cos/1, sin/1, tan/1
Bitwise operators: (/\)/2, (\/)/2, (^)/2, (~)/2, (<<)/2, (>>)/2, (>>>)/2
Type conversion functions: float/1, integer/1, string/1, string/2
UTF-8 string functions: char/2, char_to_string/1, left/2, length/1, mid/2, mid/3, right/2
Byte string functions: byte/2, byte_to_string/1, left_bytes/2, length_bytes/1, mid_bytes/2, mid_bytes/3, right_bytes/2
Random number generation: random/0
instantiation_error - An unbound variable was encountered in a subexpression. type_error(evaluable, Expr) - Expr is not an integer constant, floating-point constant, string constant, or defined arithmetic function. type_error(number, Expr) - Expr is not a number but it was used as an argument to an arithmetic function that requires a number. type_error(integer, Expr) - Expr is not an integer but it was used as an argument to an arithmetic function that requires an integer. type_error(string, Expr) - Expr is not a string but it was used as an argument to an arithmetic function that requires a string. evaluation_error(zero_divisor) - Expr attempted to divide by zero. evaluation_error(int_overflow) - a conversion to the integer type resulted in an overflow because the incoming value was too large. Note: ordinary mathematical and bitwise operators on integers like (+)/2, (*)/2, (<<)/2, etc do not report overflow.X is Y + 1 S is sin(Angle * pi / 180)
2 + 4 =:= 6 1.5 =:= 3.0 / 2 "foo" + "bar" =:= "foobar"
2 + 2 =!= 5 1.5 =!= 3.0 * 2 "foo" + "ba" =!= "foobar"
2 + 2 < 5 1.5 < 3.0 * 2 "foo" + "ba" < "foobar"
2 + 2 <= 4 1.5 <= 3.0 * 2 1.5 <= 3.0 * 0.5 "foo" + "ba" <= "foobar"
2 + 2 > 3 3.0 * 2 > 1.5 "foobar" > "foo" + "ba"
2 + 2 >= 4 3.0 * 0.5 >= 1.5 "foobar" >= "foo" + "ba"
instantiation_error - both Atom and String are variables. type_error(atom, Atom) - Atom is not an atom or variable. type_error(string, String) - Atom is a variable and String is not a string. atom_name(foobar, S) sets S to "foobar"
atom_name('hi there!', S) sets S to "hi there!"
atom_name(A, "foobar") sets A to foobar
atom_name(A, "") sets A to ''
atom_name(foobar, "barfoo") fails
atom_name(A, S) instantiation_error
atom_name(1.5, S) type_error(atom, 1.5)
atom_name(A, foobar) type_error(string, foobar)
clear, then clear all of the floating-point exception flags in the system and succeed. Otherwise, test for a specific floating-point exception and succeed if it is present. If Type is not recognized, or the exception has not been raised, then fperror(Type) fails.inexact - result could not be represented exactly. overflow - overflow occurred. undefined - result was undefined (not-a-number). underflow - underflow occurred. zero_divisor - division by zero.clear and fail for all other arguments. The isnan/1 and isinf/1 predicates may be used to detect certain error conditions.instantiation_error - Type is a variable. type_error(atom, Type) - Type is not an atom.fperror(clear); X is Y / Z; if (fperror(zero_divisor)) stderr::writeln("division by zero occurred");
isnan(nan) succeeds
isnan(float("nan")) succeeds
isnan(3) fails
isnan(inf) fails
isnan("nan") type_error(number, "nan")
isinf(inf) succeeds isinf(-inf) succeeds isinf(float("inf")) succeeds isinf(float("-inf")) succeeds isinf(3) fails isinf(nan) fails isinf("inf") type_error(number, "inf") isinf(X); X < 0 checks for negative infinity isinf(X); X > 0 checks for positive infinity
instantiation_error - Value is a variable. type_error(number, Value) - Value is not a number.randomize randomize(42)
type_error(number, Expr2) - Expr1 is a number, but Expr2 is not. type_error(string, Expr2) - Expr1 is a string, but Expr2 is not.X is 2 + 2 sets X to the integer value 4 X is 1.5 + 3 sets X to the floating-point value 4.5 X is "foo" + "bar" sets X to the string "foobar" X is 1 + "foo" type_error(number, "foo") X is "foo" + 1 type_error(string, 1) X is "foo" + string(1) sets X to the string "foo1"
-2 == - 2 will fail, but -2 =:= - 2 will succeed.type_error(number, Expr) - Expr is not a number.X is - 2 sets X to the integer value -2 X is - 1.5 sets X to the floating-point value -1.5 X is - "foo" type_error(number, "foo") X is --2 sets X to the integer value 2
type_error(number, Expr1) - Expr1 is not a number. type_error(number, Expr2) - Expr2 is not a number.X is 2 - 2 sets X to the integer value 0 X is 1.5 - 3 sets X to the floating-point value -1.5 X is 1 - "foo" type_error(number, "foo") X is "foo" - 1 type_error(number, "foo")
type_error(number, Expr1) - Expr1 is not a number. type_error(number, Expr2) - Expr2 is not a number.X is 2 * 2 sets X to the integer value 4 X is 1.5 * 3 sets X to the floating-point value 4.5 X is 1 * "foo" type_error(number, "foo") X is "foo" * 1 type_error(number, "foo")
type_error(number, Expr1) - Expr1 is not a number. type_error(number, Expr2) - Expr2 is not a number. evaluation_error(zero_divisor) - Expr2 is zero and an integer division is being performed. Floating-point division will produce not-a number (nan/0) or an infinity (inf/0) if Expr2 is zero.X is 2 / 2 sets X to the integer value 1 X is 1.5 / 3 sets X to the floating-point value 0.5 X is 1 / "foo" type_error(number, "foo") X is "foo" / 1 type_error(number, "foo") X is 42 / 0 evaluation_error(zero_divisor) X is 42 / 0.0 sets X to positive infinity X is 0.0 / 0.0 sets X to not-a-number
X is Y / Z X is float(Y) / float(Z)
X is Y // Z X is integer(Y) / integer(Z)
type_error(number, Expr1) - Expr1 is not a number. type_error(number, Expr2) - Expr2 is not a number. evaluation_error(zero_divisor) - Expr2 is zero and an integer division is being performed. Floating-point remainder will produce not-a number (nan/0) if Expr2 is zero.X is 2 % 2 sets X to the integer value 0 X is 3 % 2 sets X to the integer value 1 X is 1.5 % 3 sets X to the floating-point value 1.5 X is 1 % "foo" type_error(number, "foo") X is "foo" % 1 type_error(number, "foo") X is 42 % 0 evaluation_error(zero_divisor) X is 42 % 0.0 sets X to not-a-number
type_error(number, Expr1) - Expr1 is not a number. type_error(number, Expr2) - Expr2 is not a number. evaluation_error(zero_divisor) - Expr2 is zero and an integer division is being performed. Floating-point remainder will produce not-a number (nan/0) if Expr2 is zero.X is 2 rem 2 sets X to the integer value 0 X is 3 rem 2 sets X to the integer value 1 X is 1.5 rem 3 sets X to the floating-point value 1.5 X is 1 rem "foo" type_error(number, "foo") X is "foo" rem 1 type_error(number, "foo") X is 42 rem 0 evaluation_error(zero_divisor) X is 42 rem 0.0 sets X to not-a-number
/\ Expr2 type_error(integer, Expr1) - Expr1 is not an integer. type_error(integer, Expr2) - Expr2 is not an integer. X is 22 /\\ 5 X is set to 4
X is 22.0 /\\ 5 type_error(integer, 22.0)
X is 22 /\\ 5.0 type_error(integer, 5.0)
\/ Expr2 type_error(integer, Expr1) - Expr1 is not an integer. type_error(integer, Expr2) - Expr2 is not an integer. X is 22 \\/ 5 X is set to 23
X is 22.0 \\/ 5 type_error(integer, 22.0)
X is 22 \\/ 5.0 type_error(integer, 5.0)
^ Expr2 type_error(integer, Expr1) - Expr1 is not an integer. type_error(integer, Expr2) - Expr2 is not an integer. X is 22 ^ 5 X is set to 19
X is 22.0 ^ 5 type_error(integer, 22.0)
X is 22 ^ 5.0 type_error(integer, 5.0)
~ Expr \ Expr type_error(integer, Expr) - Expr is not an integer. X is ~22 X is set to -23
X is ~22.0 type_error(integer, 22.0)
type_error(integer, Expr1) - Expr1 is not an integer. type_error(integer, Expr2) - Expr2 is not an integer. X is 22 << 5 X is set to 704
X is 22.0 << 5 type_error(integer, 22.0)
X is 22 << 5.0 type_error(integer, 5.0)
type_error(integer, Expr1) - Expr1 is not an integer. type_error(integer, Expr2) - Expr2 is not an integer.X is 22 >> 5 X is set to 0 X is -22 >> 5 X is set to -1 X is 22.0 >> 5 type_error(integer, 22.0) X is 22 >> 5.0 type_error(integer, 5.0)
type_error(integer, Expr1) - Expr1 is not an integer. type_error(integer, Expr2) - Expr2 is not an integer.X is 22 >>> 5 X is set to 0 X is -22 >>> 5 X is set to 134217727 (0x07ffffff) X is 22.0 >>> 5 type_error(integer, 22.0) X is 22 >>> 5.0 type_error(integer, 5.0)
type_error(number, Expr) - Expr is not a number. evaluation_error(int_overflow) - Expr is the integer -2147483648, which cannot be negated to produce a positive integer value. X is abs(3) X is set to 3
X is abs(-35.125) X is set to 35.125
X is abs(-inf) X is set to inf
X is abs(nan) X is set to nan
X is abs("-35") type_error(number, "-35")
X is abs(-2147483648) evaluation_error(int_overflow)
type_error(number, Expr) - Expr is not a number. X is acos(1) sets X to 0.0
X is acos(0.0) sets X to pi / 2
X is acos(inf) sets X to nan
X is acos(nan) sets X to nan
X is acos("1.0") type_error(number, "1.0")
type_error(number, Expr) - Expr is not a number. X is asin(0) sets X to 0.0
X is asin(1.0) sets X to pi / 2
X is asin(inf) sets X to nan
X is asin(nan) sets X to nan
X is asin("1.0") type_error(number, "1.0")
type_error(number, Expr) - Expr is not a number. X is atan(1.0) sets X to pi / 4
X is atan(0) sets X to 0.0
X is atan(inf) sets X to pi / 2
X is atan(nan) sets X to nan
X is atan("1.0") type_error(number, "1.0")
type_error(number, Expr1) - Expr1 is not a number. type_error(number, Expr2) - Expr2 is not a number. X is atan2(1.0, 1.0) sets X to pi / 4
X is atan2(0, 1) sets X to 0.0
X is atan2(0, -1) sets X to pi
X is atan2(inf, 2) sets X to pi / 2
X is atan2(nan, 1) sets X to nan
X is atan2(1, nan) sets X to nan
X is atan2("2.0", 1.0) type_error(number, "2.0")
X is atan2(2.0, "1.0") type_error(number, "1.0")
type_error(number, Expr) - Expr is not a number. X is ceil(3) X is set to 3
X is ceil(35.125) X is set to 36.0
X is ceil(-35.125) X is set to -35.0
X is ceil(0.0) X is set to 0.0
X is ceil(-inf) X is set to -inf
X is ceil(nan) X is set to nan
X is ceil("-35") type_error(number, "-35")
type_error(string, Expr) - Expr is not a string. type_error(integer, Index) - Index is not an integer. domain_error(string_index, Index) - Index is out of range for Expr.X is byte("foobar", 3) X is set to 98 (character code of 'b') X is byte(1.5, 2) type_error(string, 1.5) X is byte("foobar", 3.0) type_error(integer, 3.0) X is byte("foobar", -1) domain_error(string_index, -1) X is byte("foobar", 6) domain_error(string_index, 6)
type_error(integer, Expr) - Expr is not an integer. type_error(byte, Expr) - Expr is an integer that is not within the range 0 to 255.X is byte_to_string(98) X is set to "b" X is byte_to_string(0xC1) X is set to "\xC1" X is byte_to_string(1.5) type_error(integer, 1.5) X is byte_to_string(-1) type_error(byte, -1)
type_error(string, Expr) - Expr is not a string. type_error(integer, Index) - Index is not an integer. domain_error(string_index, Index) - Index is out of range for Expr.X is char("foobar", 3) X is set to 98 (character code of 'b') X is char("\u00AF", 0) X is set to 0x00AF X is char(1.5, 2) type_error(string, 1.5) X is char("foobar", 3.0) type_error(integer, 3.0) X is char("foobar", -1) domain_error(string_index, -1) X is char("foobar", 6) domain_error(string_index, 6) X is char("\u00AF", 1) domain_error(string_index, 1)
type_error(integer, Expr) - Expr is not an integer. representation_error(character_code) - Expr is an integer that does not correspond to a valid character code.X is char_to_string(98) X is set to "b" X is char_to_string(0x00AF) X is set to "\u00AF" X is char_to_string(1.5) type_error(integer, 1.5) X is char_to_string(-1) representation_error(character_code)
type_error(number, Expr) - Expr is not a number. X is cos(0) sets X to 1.0
X is cos(pi / 2) sets X to 0.0
X is cos(inf) sets X to nan
X is cos(nan) sets X to nan
X is cos("1.0") type_error(number, "1.0")
type_error(number, Expr) - Expr is not a number. X is exp(1) X is set to e
X is exp(0) X is set to 1.0
X is exp(2.0) X is set to e * e
X is exp(-2.0) X is set to 1 / (e * e)
X is exp(inf) X is set to inf
X is exp(-inf) X is set to 0.0
X is exp(nan) X is set to nan
X is exp("2.0") type_error(number, "2.0")
E2 is e * 2
F is float(3) F is set to 3.0 F is float(3.5) F is set to 3.5 (no change) F is float(2 + 6) F is set to 8.0 F is float("-3.5e02") F is set to -350.0 (string conversion) F is float("foo") type_error(number, "foo") F is float('3.5') type_error(evaluable, '3.5')
type_error(number, Expr) - Expr is not a number. X is float_fractional_part(3) X is set to 0
X is float_fractional_part(35.125) X is set to 0.125
X is float_fractional_part(-35.125) X is set to -0.125
X is float_fractional_part(0.0) X is set to 0.0
X is float_fractional_part(-inf) X is set to 0.0
X is float_fractional_part(nan) X is set to nan
X is float_fractional_part("-35") type_error(number, "-35")
type_error(number, Expr) - Expr is not a number. X is float_integer_part(3) X is set to 3
X is float_integer_part(35.125) X is set to 35.0
X is float_integer_part(-35.125) X is set to -35.0
X is float_integer_part(0.0) X is set to 0.0
X is float_integer_part(-inf) X is set to -inf
X is float_integer_part(nan) X is set to nan
X is float_integer_part("-35") type_error(number, "-35")
type_error(number, Expr) - Expr is not a number. X is floor(3) X is set to 3
X is floor(35.125) X is set to 35.0
X is floor(-35.125) X is set to -36.0
X is floor(0.0) X is set to 0.0
X is floor(-inf) X is set to -inf
X is floor(nan) X is set to nan
X is floor("-35") type_error(number, "-35")
Inf is inf NegInf is -inf
evaluation_error(int_overflow) - a conversion to the integer type resulted in an overflow because the incoming floating-point or string value was too large. I is integer(3) I is set to 3 (no change)
I is integer(3.5) I is set to 3
I is integer(2.0 + 6.0) I is set to 8
I is integer("-35") I is set to -35 (string conversion)
I is integer("foo") type_error(integer, "foo")
I is integer('3') type_error(evaluable, '3')
I is integer(2147483648.0) evaluation_error(int_overflow)
type_error(string, Expr) - Expr is not a string. type_error(integer, Length) - Length is not an integer. domain_error(not_less_than_zero, Length) - Start is an integer that is less than zero.X is left("foobar", 3) X is set to "foo" X is left("foobar", 10) X is set to "foobar" X is left("foobar", 0) X is set to "" X is left(1.5, 1) type_error(string, 1.5) X is left("foobar", 1.0) type_error(integer, 1.0) X is left("foobar", -1) domain_error(not_less_than_zero, -1)
type_error(string, Expr) - Expr is not a string. type_error(integer, Length) - Length is not an integer. domain_error(not_less_than_zero, Length) - Start is an integer that is less than zero.X is left_bytes("foobar", 3) X is set to "foo" X is left_bytes("foobar", 10) X is set to "foobar" X is left_bytes("foobar", 0) X is set to "" X is left_bytes(1.5, 1) type_error(string, 1.5) X is left_bytes("foobar", 1.0) type_error(integer, 1.0) X is left_bytes("foobar", -1) domain_error(not_less_than_zero, -1)
type_error(string, Expr) - Expr is not a string.X is length("foobar") X is set to 6 X is length("foo" + "bar") X is set to 6 X is length("") X is set to 0 X is length("\u00AF") X is set to 1 X is length(1.5) type_error(string, 1.5)
type_error(string, Expr) - Expr is not a string.X is length_bytes("foobar") X is set to 6 X is length_bytes("foo" + "bar") X is set to 6 X is length_bytes("") X is set to 0 X is length_bytes("\u00AF") X is set to 2 X is length_bytes(1.5) type_error(string, 1.5)
type_error(number, Expr) - Expr is not a number. X is log(e) X is set to 1
X is log(1) X is set to 0.0
X is log(e * e) X is set to 2.0
X is log(1 / (e * e)) X is set to -2.0
X is log(0.0) X is set to -inf
X is log(inf) X is set to inf
X is log(-inf) X is set to nan
X is log(nan) X is set to nan
X is log("2.0") type_error(number, "2.0")
type_error(string, Expr) - Expr is not a string. type_error(integer, Start) - Start is not an integer. type_error(integer, Length) - Length is not an integer. domain_error(not_less_than_zero, Start) - Start is an integer that is less than zero. domain_error(not_less_than_zero, Length) - Start is an integer that is less than zero.X is mid("foobar", 1, 4) X is set to "ooba" X is mid("foobar", 1, 0) X is set to "" X is mid("foobar", 10, 3) X is set to "" X is mid("foobar", 4, 3) X is set to "ar" X is mid("foobar", 4) X is set to "ar" X is mid(1.5, 1) type_error(string, 1.5) X is mid("foobar", 1.0, 4) type_error(integer, 1.0) X is mid("foobar", 1, 4.0) type_error(integer, 4.0) X is mid("foobar", -1) domain_error(not_less_than_zero, -1) X is mid("foobar", 1, -4) domain_error(not_less_than_zero, -4)
type_error(string, Expr) - Expr is not a string. type_error(integer, Start) - Start is not an integer. type_error(integer, Length) - Length is not an integer. domain_error(not_less_than_zero, Start) - Start is an integer that is less than zero. domain_error(not_less_than_zero, Length) - Start is an integer that is less than zero.X is mid_bytes("foobar", 1, 4) X is set to "ooba" X is mid_bytes("foobar", 1, 0) X is set to "" X is mid_bytes("foobar", 10, 3) X is set to "" X is mid_bytes("foobar", 4, 3) X is set to "ar" X is mid_bytes("foobar", 4) X is set to "ar" X is mid_bytes(1.5, 1) type_error(string, 1.5) X is mid_bytes("foobar", 1.0, 4) type_error(integer, 1.0) X is mid_bytes("foobar", 1, 4.0) type_error(integer, 4.0) X is mid_bytes("foobar", -1) domain_error(not_less_than_zero, -1) X is mid_bytes("foobar", 1, -4) domain_error(not_less_than_zero, -4)
NaN is nan
PIOver2 is pi / 2
type_error(number, Expr1) - Expr1 is not a number. type_error(number, Expr2) - Expr2 is not a number. X is pow(2, 3) X is set to 8
X is pow(3.5, 0) X is set to 1.0
X is pow(9, 0.5) X is set to 3.0
X is pow(1.0, 43) X is set to 1.0
X is pow(1.0, nan) X is set to 1.0
X is pow(nan, 0) X is set to 1.0
X is pow(0.0, 20) X is set to 0.0
X is pow(-1, inf) X is set to 1.0
X is pow(-1, -inf) X is set to 1.0
X is pow(0.5, -inf) X is set to inf
X is pow(1.5, -inf) X is set to 0.0
X is pow(1.5, inf) X is set to inf
X is pow(-inf, -3) X is set to 0.0
X is pow(-inf, 3) X is set to -inf
X is pow(-inf, 4) X is set to inf
X is pow(inf, -2) X is set to 0.0
X is pow(inf, 2) X is set to inf
X is pow(0.0, -2) X is set to inf
X is pow(nan, nan) X is set to nan
X is pow("2.0", 2) type_error(number, "2.0")
X is pow(2, "2.0") type_error(number, "2.0")
X is random generates a float between 0.0 and 1.0
X is integer(random * 20) generates an integer between 0 and 19
type_error(string, Expr) - Expr is not a string. type_error(integer, Length) - Length is not an integer. domain_error(not_less_than_zero, Length) - Start is an integer that is less than zero.X is right("foobar", 3) X is set to "bar" X is right("foobar", 10) X is set to "foobar" X is right("foobar", 0) X is set to "" X is right(1.5, 1) type_error(string, 1.5) X is right("foobar", 1.0) type_error(integer, 1.0) X is right("foobar", -1) domain_error(not_less_than_zero, -1)
type_error(string, Expr) - Expr is not a string. type_error(integer, Length) - Length is not an integer. domain_error(not_less_than_zero, Length) - Start is an integer that is less than zero.X is right_bytes("foobar", 3) X is set to "bar" X is right_bytes("foobar", 10) X is set to "foobar" X is right_bytes("foobar", 0) X is set to "" X is right_bytes(1.5, 1) type_error(string, 1.5) X is right_bytes("foobar", 1.0) type_error(integer, 1.0) X is right_bytes("foobar", -1) domain_error(not_less_than_zero, -1)
type_error(number, Expr) - Expr is not a number. X is round(3) X is set to 3
X is round(35.125) X is set to 35.0
X is round(35.5) X is set to 36.0
X is round(35.625) X is set to 36.0
X is round(-35.125) X is set to -35.0
X is round(-35.5) X is set to -36.0
X is round(-35.625) X is set to -36.0
X is round(0.0) X is set to 0.0
X is round(-inf) X is set to -inf
X is round(nan) X is set to nan
X is round("-35") type_error(number, "-35")
type_error(number, Expr) - Expr is not a number. X is sign(3) X is set to 1
X is sign(-35.125) X is set to -1
X is sign(0.0) X is set to 0
X is sign(-0.0) X is set to 0
X is sign(-inf) X is set to -1
X is sign(nan) X is set to 0
X is sign("-35") type_error(number, "-35")
type_error(number, Expr) - Expr is not a number. X is sin(0) sets X to 0.0
X is sin(pi / 2) sets X to 1.0
X is sin(inf) sets X to nan
X is sin(nan) sets X to nan
X is sin("1.0") type_error(number, "1.0")
type_error(number, Expr) - Expr is not a number. X is sqrt(1) X is set to 1.0
X is sqrt(0.0) X is set to 0.0
X is sqrt(2.0) X is set to 1.41421...
X is sqrt(256) X is set to 16.0
X is sqrt(inf) X is set to inf
X is sqrt(-2.0) X is set to nan
X is sqrt(-inf) X is set to nan
X is sqrt(nan) X is set to nan
X is sqrt("2.0") type_error(number, "2.0")
S is string(3) S is set to "3" S is string(3.5) S is set to "3.5" S is string(2.0 + 6.0) S is set to "8.0" S is string("foo") S is set to "foo" (no change) S is string(2.0e35) S is set to "2e+35" S is string('3') type_error(evaluable, '3')
P is the result of evaluating Precision. A trailing "<tt>.0</tt>" will be added if necessary to make the value a valid Plang floating-point constant.S is string(3, 2) S is set to "3" S is string(3.5, 2) S is set to "3.5" S is string(3.125, 2) S is set to "3.1" S is string("foo", 2) S is set to "foo" (no change) S is string('3') type_error(evaluable, '3')
type_error(number, Expr) - Expr is not a number. X is tan(0) sets X to 0.0
X is tan(1.0) sets X to 1.557407...
X is tan(inf) sets X to nan
X is tan(nan) sets X to nan
X is tan("1.0") type_error(number, "1.0")
1.6.1