Unlike other spreadsheets, the operators in TEAPOT check the type of the values they are applied to, which means trying to add a string to a floating point number will result in an type error. Operators on locations in the spreadsheet, which are just triples of integers, generally operate following typical rules for vectors, with particular notes below. The following operators are available, listed in ascending precedence:

**x and y**- evaluates to the logical conjunction of values x and y. Note that this evaluation short-circuits: if x is false, then y is never evaluated, and so does not affect the value even if it is an error, for example. In determining the value, the boolean conversions of x and y are used (see the description of the bool() function below), but the actual value returned is either that of x or y, namely, x if it corresponds to a boolean false value or y otherwise.
**x or y**- evaluates to the logical disjunction of boolean values x and y. As with and, this evaluation short-circuits if x is true. Also in similar fashion, the value is x if it corresponds to a boolean true value and y otherwise.
**x<y**- evaluates to Boolean true if x is less than y. If x or y are empty, they are considered to be 0 if the other is an integer number, 0.0 if it is a floating point number and the empty string if it is a string. On locations, x<y if every component of x is less than or equal to the corresponding component of y and at least one is strictly less.
**x<=y**- evaluates to true if x is less than or equal to y. For locations, this must hold for every component.
**x>=y**- evaluates to true if x is greater than or equal to y. For locations, this must hold for every component.
**x>y**- evaluates to true if x is greater than y. As with <, for locations, every component must be greater than or equal, and at least one must be strictly greater.
**x==y**- evaluates to true if x is equal to y.
**x~=y**- evaluates to true if the floating point value x is almost equal to the floating point value y. Almost equal means that the numbers are equal or neighbor each other in the floating point representation being used. It is an error to use this comparison with any type but float.
**x!=y**- evaluates to 1 if x is not equal to y.
**Note:**- a string of consecutive relational operators is interpreted as the conjunction of each consecutive (overlapping) pair. Thus 2 <= y() <= 10 will evaluate to true precisely in rows 2 through 10, inclusive (it is shorthand for 2 <= y() and y() <= 10). Similarly @(cell1) == @(cell2) == @(cell3) will return true exactly when all three cells have the same value.
**x+y**- evaluates to the sum if x and y are numbers. If x and y are strings, the result is the concatenated string. If they are locations, this operates componentwise. If they are styles, it means to take any unset components of the left-hand style and fill them in with values from the right-hand style (ignoring the right-hand components that are already set in the left-hand style).
**x-y**- evaluates to the difference if x and y are numbers. If they are locations, this operates componentwise.
**x*y**- evaluates to the product if x and y are numbers. You can multiply a location by an integer, or take the dot product of the coordinates of two locations (although the use case for that is unclear).
**x/y**- evaluates to the quotient if x and y are numbers. You can divide a location by an integer.
**x%y**- evaluates to the remainder of the division if x and y are numbers. You can mod a location by an integer, or operate on two locations, in which case the mod operation applies componentwise.
**-x**- evaluates to -x if x is a number or location, or the negation of x if x is Boolean. If x is empty, the result will be empty, too.
**x^y**- evaluates to x to the power of y.
**(expression)**- evaluates to the expression.
**function(argument,...)**- evaluates to the value of the function applied to the values resulting from evaluating the argument expressions. Note that if no arguments are being supplied, the parentheses are optional. Hence, for example, you can use “e” by itself, like a reserved constant whose value is the usual mathematical “e,” the base of natural logarithms.