Digits is an android app designed to make engineering and scientific calculations easier. It was born out of my own need to perform calculations with units of different magnitude. Users may upgrade to a “pro” mode if they would like access to a larger variety of skins. Parsing is done over a unicode string, so the user may copy/paste expressions if they wish.
The app is written entirely in Kotlin. Currently, the BigDecimal library is used for the numerical calculations. Unit calculations are performed in terms of SI base units. Significant figure calculations are performed alongside numerical ones.
The app is divided into four components.
- UI- This accepts controls from the user. It uses the parsing component to calculate the result and the humanization layer to display it.
- Parsing- This reads the user input and evaluates the expression and any errors. It uses the calculation component.
- Calculation- This performs the value, unit and sigfig calculations.
- Humanization- This heuristically formats internal values and units into something the user prefers to see.
Since all calculations are performed in terms of SI base units, they must be humanized before being displayed to the user. Humanization of the units is performed by running Dijkstra’s algorithim over a graph which starts at a unitless quantity and each edge adds a derived unit (like seconds, joules, or amps). For example, if the result of a calculation has the units
m⋅s⁻², the unit
m/s² is chosen after exploring
m -> ms⁻¹ -> ms⁻² and rendering the result as
m/s². If the result of a calculation has the units
Js is chosen because it could be constructed by using a derived unit twice. The search is directed by minimizing by the difference in SI base units. This keeps a unit like
s⁴ from being searched before
Js. These results are cached so performance with unnaturally large units, like
s⁶⁰, is fine.
Unit tests are used to validate the parsing, calculation, and humanization components.