Scientific notation intended for tokenization.
This library provides a type used to represent a number in scientific notation. This is most frequently useful when tokenizing or parsing a language. Languages like JSON and SQL support numberic literals written in scientific notation, even though backends frequently reject numbers outside a given range. This library provides a compact representation of numbers in scientific notation. In the common case of the coefficient and then exponent each being small enough to be represented by a machine word, this library avoids the need for any indirections to retrieve the number. Consider some tokenization scheme: `data Token = ... | Number {-# UNPACK #-} !Scientific`. In this case, the unboxed coefficient and exponent are unpacked into the Number
data constructor if they can each be represented by a machine word.
The internal representation does not normalize numbers. That is, parsing `300e-2` resulting in a representation that uses `300` and `-2` rather than `3` and `0`. This work is deferred with the expectation that a number in scientific notation is consumed either zero or one times. This library is not optimized for use-cases that consume a Scientific
more than once since normalization is reapplied every time.
The primary library that operates in this same space is scientific
. Compared to scientific
, this library distinguishes itself from scientific
in the following ways:
Correctness:
scientific
does not correctly handle large exponents. See issue #62.Parsing: The `scientific-notation` parser outperforms the
scientific
parser that ships withaeson
by a factor of five on small numbers.