Fixed Point Number Library
The Fixed Point Number Library provides a library to use fixed-point numbers in Sway. It has 3 distinct unsigned types: UFP32
, UFP64
and UFP128
as well as 3 signed types IFP64
, IFP128
and IFP256
. These types are stack allocated.
This type is stored as a u32
, u64
or U128
under the hood. Therefore the size can be known at compile time and the length is static.
For implementation details on the Fixed Point Number Library please see the Sway Libs Docs.
Importing the Fixed Point Number Library
In order to use the Fixed Point Number Library, Sway Libs must be added to the Forc.toml
file and then imported into your Sway project. To add Sway Libs as a dependency to the Forc.toml
file in your project please see the Getting Started.
To import the Fixed Point Number Library to your Sway Smart Contract, add the following to your Sway file:
use sway_libs::fixed_point::*;
Supported Fixed Point Numbers
Signed Fixed Point Numbers
We currently support the following signed Fixed Point numbers:
IFP64
IFP128
IFP256
In order to use the IFP64
, IFP128
or IFP256
types, import them into your Sway project like so:
use sway_libs::fixed_point::{ifp128::IFP128, ifp256::IFP256, ifp64::IFP64,};
Unsigned Fixed Point Numbers
We currently support the following unsigned Fixed Point numbers:
UFP32
UFP64
UFP128
In order to use the UFP32
, UFP64
or UFP128
types, import them into your Sway project like so:
use sway_libs::fixed_point::{ufp128::UFP128, ufp32::UFP32, ufp64::UFP64,};
Basic Functionality
Instantiating a New Fixed Point Number
Once imported, any signed or unsigned Fixed Point number type can be instantiated by defining a new variable and calling the from
function.
let mut ufp32_value = UFP32::from(0u32);
let mut ufp64_value = UFP64::from(0u64);
let mut ufp128_value = UFP128::from((0u64, 0u64));
Basic mathematical Functions
Basic arithmetic operations are working as usual.
fn add_ufp(val1: UFP64, val2: UFP64) {
let result: UFP64 = val1 + val2;
}
fn subtract_ufp(val1: UFP64, val2: UFP64) {
let result: UFP64 = val1 - val2;
}
fn multiply_ufp(val1: UFP64, val2: UFP64) {
let result: UFP64 = val1 * val2;
}
fn divide_ufp(val1: UFP64, val2: UFP64) {
let result: UFP64 = val1 / val2;
}
Advanced mathematical Functions Supported
We currently support the following advanced mathematical functions:
Exponential
let ten = UFP64::from_uint(10);
let res = UFP64::exp(ten);
Square Root
let ufp64_169 = UFP64::from_uint(169);
let res = UFP64::sqrt(ufp64_169);
Power
let five = UFP64::from_uint(5);
let res = five.pow(3u32);