# Built In Types: Num

The type `num` can represent any `int` or `float` value. This type can be useful when specifying the interface to a function. Consider the following function declarations from the math library:

``````function sqrt(num \$arg): float;
function log(num \$arg, ?num \$base = null): float;
function abs<T as num>(T \$number): T;
function mean(Container<num> \$numbers): ?float;
``````

The square-root function `sqrt` takes a `num` and returns a `float`. The log-to-any-base function `log` takes a `num` and a nullable-of-`num` and returns a `float`. The generic absolute-value function `abs` has one type parameter, `T`, which is constrained to having type `num` or a subtype of `num`. `abs` takes an argument of type `T` and returns a value of the same type. The arithmetic-mean function `mean` takes a generic type `Container`-of-type-`num` and returns a nullable-of-`float`.

Consider the following example:

``````class Point {
private float \$x;
private float \$y;
public function __construct(num \$x = 0, num \$y = 0) {
\$this->x = (float)\$x;
\$this->y = (float)\$y;
}
public function move(num \$x = 0, num \$y = 0): void {
\$this->x = (float)\$x;
\$this->y = (float)\$y;
}
// ...
}
``````

Internally, class `Point` stores the x- and y-coordinates as `float`s, but, for convenience, it allows any combination of `int`s and `float`s to be passed to its constructor and method `move`.

When given a `num` value, to find out what type of value that `num` actually contains, use the `is` operator.

See the discussion of type refinement.