An arithmetic engine that conservatively widens the operation arguments
to extent that they can hold the result of the operation. Widening
conversions occur in following situations:
- byte and short are always widened to int (alike to Java language).
- To preserve magnitude: when operands are of different types, the
result type is the type of the wider operand.
- to avoid overflows: if add, subtract, or multiply would overflow on
integer types, the result is widened from int to long, or from long to
BigInteger.
- to preserve fractional part: if a division of integer types would
have a fractional part, int and long are converted to double, and
BigInteger is converted to BigDecimal. An operation on a float and a
long results in a double. An operation on a float or double and a
BigInteger results in a BigDecimal.