This package currently exports a tiny function base_numeric_type that
extracts the base numeric type from a numeric type T:
base_numeric_type(::Type{T}) where {T}base_numeric_type(x::T)
For example,
| Input Type | Output Type | 
|---|---|
Float32 | 
Float32 | 
ComplexF32 | 
Float32 | 
Measurement{Float32} | 
Float32 | 
Dual{BigFloat} | 
BigFloat | 
Dual{ComplexF32} | 
Float32 | 
Rational{Int8} | 
Int8 | 
Quantity{Float32, ...} | 
Float32 | 
Quantity{Measurement{Float32}, ...} | 
Float32 | 
Package maintainers should write a specialized method for their type. For example, to define the base numeric type for a dual number, one could write:
import BaseType: base_numeric_type
base_numeric_type(::Type{Dual{T}}) where {T} = base_numeric_type(T)It is important to call base_numeric_type recursively like this to deal with
nested numeric types such as Quantity{Measurement{T}}.
The fallback behavior of base_numeric_type is to return the first type parameter,
or, if that type has parameters of its own (such as Dual{Complex{Float32}}),
to recursively take the first type parameter until a non-parameterized type is found.
This works for the vast majority of types, but it is still preferred
if package maintainers write a specialized method.