Provides the @SI macro for converting numbers with SI prefixes
julia> @SI 4.5T
4.5e12
julia> @SI values = [1.2n, 100a, 5.7G]
3-element Vector{Float64}:
1.2e-9
1.0e-16
5.7e9
The following scaling factors are recognized:
| Scaling Symbol | Factor |
|---|---|
| Y | 1e24 |
| Z | 1e21 |
| E | 1e18 |
| P | 1e15 |
| T | 1e12 |
| G | 1e9 |
| M | 1e6 |
| K | 1e3 |
| k | 1e3 |
| m | 1e-3 |
| u | 1e-6 |
| μ | 1e-6 |
| n | 1e-9 |
| p | 1e-12 |
| f | 1e-15 |
| a | 1e-18 |
| z | 1e-21 |
| y | 1e-24 |
That was considered but it has two downsides
For example, compare:
julia> @SI 100a
1.0e-16
julia> const a = 1e-18
1.0e-18
julia> 100a
1.0000000000000001e-16
As you can see the 100 * 1e-18 has worse accuracy.
The other downside of defining constants
for the scaling factors is it uses a lot of
single character variables.
With @SI it reads a block in and
only converts expressions with a literal number
followed by an SI scaling factor. For example:
julia> function f(k)
c1 = k + 2k
c2 = @SI k + 2k
return (c1=c1, c2=c2)
end
f (generic function with 1 method)
julia> f(10)
(c1 = 30, c2 = 2010.0)
Note that for c2 the k in 2k was interpreted as 2*1e3 while the preceeding k was not. If const k = 1000 was defined at
the top level then the argument k would take
precedence and k scalings inside f would
not work.