Hi fellow wiki editors!

To help newly registered users get more familiar with the wiki (and maybe older users too) there is now a {{Welcome to the wiki}} template. Have a look at it and feel free to add it to new users discussion pages (and perhaps your own).

I have tried to keep the template short, but meaningful. /Johan G

# Nasal library/math

This page contains documentation for the `math` namespace in Nasal. This namespace provides various mathematical functions and variables. The `math` namespace is sourced from two files:

 Tip  Copy & paste the examples into your Nasal Console and execute them to see what they do.

## Functions

### abs()

`math.abs(x);`
This simple function returns the absolute value of the provided number.
x
This argument is required and should be a number.

Examples

`print(math.abs(1)); # prints "1"`
`print(math.abs(-1)); # prints "1"`

### acos()

`math.acos(x);`
Implements the arccosine trigonometric function. Returns an angle in radians from the given ratio.
x
Mandatory number that should be a ratio in the range -1 ≤ x ≤ 1.

Example

```var ratio = 1 / 1.414;
print(math.acos(ratio) * R2D); # prints the angle in degrees (approximately 45)```

### asin()

`math.asin(x);`
Implements the arcsine trigonometric function. Returns an angle in radians from the given ratio.
x
Mandatory number that should be a ratio in the range -1 ≤ x ≤ 1.

Example

```var ratio = 1 / 1.414;
print(math.asin(ratio) * R2D); # prints the angle in degrees (approximately 45)```

### atan2()

`math.atan2(y, x);`
Implements the two-argument version of the arctangent trigonometric function. Returns an angle in radians between the positive x-axis of a plane and the point given by the coordinates (x, y) on it.
y
Mandatory y-axis coordinate as a number.
x
Mandatory x-axis coordinate as a number.

Examples

```var x = 1;
var y = 1;
print(math.atan2(y, x) * R2D); # prints the angle in degrees (45)```
```var x = -1;
var y = -1;
print(math.atan2(y, x) * R2D); # prints the angle in degrees (-135)```

### avg()

`math.avg(x[, y[, z[, ...]]]);`

Source — Version added: FG 2.4 (Commit)

Returns the average of the given numbers. There must be at least one argument, but there may be as many as you like.

Example

`print(math.avg(1, 2, 3, 4)); # prints 2.5`

### ceil()

`math.ceil(x);`

Source — Version added: FG 2.10 (Commit)

Returns the ceiling of a number, that is, the smallest following integer.
x
Number to return the ceiling of.

Examples

`print(math.ceil(2)); # prints 2`
`print(math.ceil(2.1)); # prints 3`
`print(math.ceil(-2.9)); # prints -2`

### clamp()

`math.clamp(x, min, max);`

Source — Version added: FG 2.10 (Commit)

Clamps a number so that is within the range given. All arguments are mandatory and must be numbers.
 Note  Up until FG v2016.2, the clamping algorithm was not correct, meaning that the function will not behave correctly in FlightGear versions below 2016.2. It was fixed by SimGear commit bba11c
.
x
The number to be clamped.
min
Lower limit of the clamping range.
max
Upper limit of the clamping range.

Examples

Note that none of these examples will work properly in FlightGear versions below 2016.2.
`print(math.clamp(5, 1, 10)); # prints 5`
`print(math.clamp(0, 1, 10)); # prints 1`
`print(math.clamp(12, 1, 10)); # prints 10`

### cos()

`math.cos(x);`
Implements the cosine trigonometric function. Returns a ratio from a given angle in radians.
x
Mandatory number that should be an angle in radians.

Example

```var angle = 180 * D2R;
print(math.cos(angle)); # prints the ratio (-1)```

### exp()

`math.exp(x);`
Returns the value of e raised to the given poweer.
x
Mandatory number which is the value of the exponent.

Example

`printf("%.4f", math.exp(2)); # prints 7.3891`

### floor()

`math.floor(x);`

Source — Version added: FG 2.10 (Commit)

Returns the floor of a number, that is, the largest previous integer.
x
Number to return the floor of.

Examples

`print(math.floor(2)); # prints 2`
`print(math.floor(2.1)); # prints 2`
`print(math.floor(-2.9)); # prints -3`

### fmod()

`math.fmod(x, y);`

Source — Version added: FG 2.10 (Commit)

Returns the result of the modulo operation of the given numbers, that is, is returns the remainder of x divided by y. Unlike `mod()` , this function uses the C library function `fmod()` , and has different (and more correct) behavior when negative arguments are passed to it (compare example 3 with example 3 of `mod()` ). Both arguments are mandatory and must be numbers.
 Note  This function was initially added `math.mod()`, but this was overridden by another version which already existed in FGData. In FlightGear 3.0, this function was renamed to `fmod()`.
x
The dividend.
y
The divisor. If this argument is 0, a floating point error will be generated.

Examples

`print(math.fmod(5, 2)); # prints 1 (2 goes into 5 twice with a remainder of 1; 2 * 2 + 1 = 5)`
`print(math.fmod(10, 5)); # prints 0 (5 goes into 10 twice with a remainder of 0; 5 * 2 + 0 = 10)`
`print(math.fmod(-5, 2)); # prints -1 (2 goes into -5 -2 times with a remainder of -1; 2 * -2 + -1 = -5)`

### ln()

`math.ln(x);`
Returns the natural (base e) logarithm of the given number.
x
Number to return the logarithm of. Must be greater than 0.

Example

`printf("%.4f", math.ln(60)); # prints 4.0943`

### log10()

`math.log10(x);`
Returns the common (base 10) logarithm of the given number.
x
Number to return the logarithm of. Must be greater than 0.

Example

`printf("%g", math.log10(1000)); # prints 3`

### max()

`math.max(x[, y[, z[, ...]]]);`

Source — Version added: FG 2.4 (Commit)

Returns the highest number of the given numbers. There must be at least one argument, but there may be as many as you like.

Example

`print(math.max(1, 2, 3, 4)); # prints 4`

### min()

`math.min(x[, y[, z[, ...]]]);`

Source — Version added: FG 2.4 (Commit)

Returns the lowest number of the given numbers. There must be at least one argument, but there may be as many as you like.

Example

`print(math.min(1, 2, 3, 4)); # prints 1`

### mod()

`math.mod(x, y);`
Returns the result of the modulo operation of the given numbers, that is, is returns the remainder of x divided by y. Note that this function does not not return correct answers when either or both the arguments are negative (see example 3), unlike `fmod()`. Both arguments are mandatory and must be numbers.
x
The dividend.
y
The divisor. If this argument is 0, infinity will be returned (printed as `0e-00`).

Examples

`print(math.mod(5, 2)); # prints 1 (2 goes into 5 twice with a remainder of 1; 2 * 2 + 1 = 5)`
`print(math.mod(10, 5)); # prints 0 (5 goes into 10 twice with a remainder of 0; 5 * 2 + 0 = 10)`
`print(math.mod(-5, 4)); # prints 3 (incorrect, should be -1)`

### periodic()

`math.periodic(min, max, x);`

Source — Version added: FG 2.10 (Commit)

Normalizes the given number (e.g., a bearing) to be within a set periodic range (e.g., compass bearings, which go from 0 to 360). All the arguments are mandatory and must be numbers.
min
Lower boundary of the periodic range.
max
Upper boundary of the periodic range
x
Number to normalize.

Examples

```var norm_360 = func(a){
return math.periodic(0, 360, a);
}

print(norm_360(-90)); # prints 270
print(norm_360(45)); # prints 45```
```var norm_180 = func(a){
return math.periodic(-180, 180, a);
}

print(norm_180(45)); # prints 45
print(norm_180(270)); # prints -90```
`print(math.periodic(0, 10, 15)); # prints 5`

### pow()

`math.pow(b, n);`
Returns the base b raised to the n power. Both arguments are mandatory and must be numbers.
b
Base.
n
Exponent.

Example

`print(math.pow(2, 2)); # prints 4`

### round()

`math.round(x[, p]);`

Source — Version added: FG 3.0 (Commit)

Rounds x to the optional precision (p). If the fractional part of x is 0.5, it will always be rounded up. Both argument must be numbers.
x
Mandatory number to round.
p
Optional precision to round to. For example, if this is set to 10, x will be rounded to the nearest 10. Defaults to 1, and should be greater than or equal to 1 for correct output. For rounding to decimal places, it is better to use `sprintf` .

Examples

`print(math.round(4.2)); # prints 4`
`print(math.round(4.7)); # prints 5`
`print(math.round(4.5)); # prints 5`
`print(math.round(127, 10)); # prints 130`
`print(math.round(456, 100)); # prints 500`

### sin()

`math.sin(x);`
Implements the sine trigonometric function. Returns a ratio from a given angle in radians.
x
Mandatory number that should be an angle in radians.

Example

```var angle = 90 * D2R;
print(math.sin(angle)); # prints the ratio (1)```

### sgn()

`math.sgn(x);`
Returns the result of the sign function on the given number. If x is less than 0, -1 one is returned. If x equals 0, 0 is returned. If x is greater than 0, 1 is returned.
x
Mandatory number to return the sign of.

Examples

`print(math.sgn(-6)); # prints -1`
`print(math.sgn(0)); # prints 0`
`print(math.sgn(12)); # prints 1`

### sqrt()

`math.sqrt(x);`
Returns the square root of the given number.
x
Mandatory number to return the square root of. Must be greater than or equal to 0.

Example

`print(math.sqrt(9)); # prints 3`

### tan()

`math.tan(x);`
Implements the tangent trigonometric function. Returns a ratio from a given angle in radians.
x
Mandatory number that should be an angle in radians.

Example

```var angle = 45 * D2R;
print(math.tan(angle)); # prints the ratio (1)```

## Variables

### e

`math.e;`
Important mathematical constant (see e (mathematical constant) ). Value in simulation: 2.7182818284590452354

### pi

`math.pi;`
Important mathematical constant (see pi (mathematical constant) ). Value in simulation: 3.14159265358979323846