MyNixOS website logo
Description

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 with aeson by a factor of five on small numbers.

Metadata

Version

0.1.7.0

Platforms (77)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-windows
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows