> For the complete documentation index, see [llms.txt](https://docs.zk.link/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.zk.link/developer/api-and-sdk/private_key/algorithm.md).

# Algorithm

The integer is composed of `mantissa` and `exponent` part of encoding, and pack algorithm is:

> `integer = mantissa * (exponent_base^exponent)`

where the `exponent_base` is `10`. This compression algorithm is mainly targeted at two types of data `fee` and `amount`:

* fee: 11 bits of mantissa and 5bits of exponent, total in 2 bytes
* amount: 35 bits of mantissa and 5bits of exponent, total in 5 bytes

## max value limitation of algorithm

For the `amount`, the max mantissa is `2^35 - 1`, and the max exponent is `2^5 - 1` or `31`. According to the pack algorithm, when exponent larger than 30, the result will exceed `u128`, so we use `30` as the max value of exponent, the max value of `amount` is

> max\_amount = (2^35 - 1) \* 10^30 = 34359738367000000000000000000000000000

For the `fee`, the max mantissa is `2^11 - 1`, and the max exponent is `2^5 - 1` or `31`, which make the max value of `fee` is

> max\_fee = (2^11 - 1) \* 10^31 = 20470000000000000000000000000000000

## Numerical precision loss

According to the formula, it can be seen that the compression algorithm will be numerical precision loss. For the numbers smaller than `2^128` will be changed after compression and cannot be recovered. For example, a `fee` integer is `(2^10+1)*10^2+1 = 102501` where the `mantissa` is `2^10+1=101` and the `exponent` is `2`, the pack result will be `(2^10+1)*10^2 = 102500` which results in a `1` numerical precision loss.

`version: 4457a91`
