## fixed_math

Some math traits and functions for `fixed` point numbers

### 3 releases

 0.1.2 Mar 29, 2023 Jan 17, 2023 Jan 17, 2023

#253 in Math

MIT/Apache

57KB
1K SLoC

# Fixed Math

This library implements analytic/trigonometric functions for fixed point numbers.

Implemented functions:

• `sqrt` from trait `FixedSqrt`
• `FixedSqrt` is not implemented for fixed numbers with less than 2 integer bits, but there are functions that work on those types: `sqrt_i1`, ...
• `sin_cos`, `sin`, `cos`, `tan` from trait `FixedSinCos`
• `FixedSinCos` is not implemented for fixed numbers with less than 7 integer bits, but there are functions that work on some of those types: `sin_cos_i7`, ...
• All calculations are made in degrees
• except that there is a `sin_cos_rad` function which is very imprecise; check source code for why, feel free to fix it (its not a priority for me)

## Examples

There are traits and standalone functions, see examples on how to use them.

### Errors

Check the examples to see about how much error this implementation produces.

Usually `sqrt` has an error of around 1-2 Delta.
(Delta = the distance to the next representable number)

`sin_cos` may produce bigger errors, around 1-2 decimal places.

## Benchmarks

You can check or run the benchmarks in `benches`.

Here are some conclusions I've got to:

### SinCos

2022-09-28

Calculation time for sin_cos varies with the fixed number's byte size.

• I10F6: ~ 8ns
• I16F16: ~ 9ns
• I32F32: ~ 18ns
• I32F96: ~ 210ns

Notes:

• there are many different int bit / frac bit combinations; I did not test them
(int bits must be >= 10 (but maybe I can do something to relax that further))
• these are all calculations in degrees
• code was compiled with native cpu features
• go for FixedI32 instead of FixedI16 unless you are limited by memory much
• I did a benchmark in the same style on `cordic`'s `sin_cos` on FixedI64
• keep in mind that `cordic` works with radians, I used the same angle values
• so they can take `sin_cos` of a lot bigger angle on the same number representation size
• this crate was about 1.5-2 times faster on same angle sizes

All code in this repository is dual-licensed under either: