Spec-Zone.ru › Nim

std/private/dragonbox

Исходный кодРедактировать

Авторское право 2020 Junekey Jeon Авторское право 2020 Alexander Bolz

Распространяется по лицензии Boost Software License, версия 1.0. (См. прилагаемый файл LICENSE_1_0.txt или копию по адресу https://www.boost.org/LICENSE_1_0.txt)

char* output_end = Dtoa(buffer, value);

Преобразует заданное число двойной точности в десятичную форму и сохраняет результат в заданном буфере.

Буфер должен быть достаточно большим, т.е. >= DtoaMinBufferLength. Формат вывода аналогичен printf("%g"). Вывод _не завершается нулём.

Вывод является оптимальным, т.е. строка вывода

  1. округляется до входного числа при чтении (с использованием округления до ближайшего чётного)
  2. является максимально короткой,
  3. является максимально близкой к входному числу.

Примечание: эта функция может временно записать до DtoaMinBufferLength символов в буфер.

В этом файле содержится реализация алгоритма Dragonbox от Junekey Jeon.

Это упрощённая версия эталонной реализации, которая находится здесь: https://github.com/jk-jeon/dragonbox

Эталонная реализация также работает с числами одинарной точности и имеет опции для настройки режима округления.

namespace Возвращает floor(x / 2^n).

Технически, сдвиг вправо отрицательных целых чисел определяется реализацией... Должно быть легко оптимизировано в инструкцию SAR (или эквивалентную).

Возвращает, является ли значение кратным 2^e2Возвращает, является ли значение кратным 5^e5Возвращает (x * y) / 2^128

Импорты

digitsutils

Типы

BitsType = uint64
Исходный код Редактировать
Double = object
  bits*: BitsType
Исходный код Редактировать
FloatingDecimal64 {.bycopy.} = object
  significand*: uint64
  exponent*: int32
Исходный код Редактировать
uint64x2 {.bycopy.} = object
  hi*: uint64
  lo*: uint64
Исходный код Редактировать
ValueType = float
Исходный код Редактировать

Константы

dtoaMinBufferLength: cint = 64
Исходный код Редактировать
exponentBias: int32 = 1075'i32
Исходный код Редактировать
exponentMask: BitsType = 9218868437227405312'u64
Исходный код Редактировать
hiddenBit: BitsType = 4503599627370496'u64
Исходный код Редактировать
maxIeeeExponent: BitsType = 2047'u
Исходный код Редактировать
significandMask: BitsType = 4503599627370495'u64
Исходный код Редактировать
significandSize: int32 = 53
Исходный код Редактировать
signMask: BitsType = 9223372036854775808'u64
Исходный код Редактировать

Процедуры

proc computeDelta(pow10: uint64x2; betaMinus1: int32): uint32 {.inline,
    ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc computePow10(k: int32): uint64x2 {.inline, ...raises: [], tags: [],
                                        forbids: [].}
Источник Изменить
proc constructDouble(bits: BitsType): Double {....raises: [], tags: [], forbids: [].}
Источник Изменить
proc constructDouble(value: ValueType): Double {....raises: [], tags: [],
    forbids: [].}
Источник Изменить
proc decimalLength(v: uint64): int {.inline, ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc floorDivPow2(x: int32; n: int32): int32 {.inline, ...raises: [], tags: [],
    forbids: [].}
Источник Изменить
proc floorLog2Pow10(e: int32): int32 {.inline, ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc floorLog10Pow2(e: int32): int32 {.inline, ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc floorLog10ThreeQuartersPow2(e: int32): int32 {.inline, ...raises: [],
    tags: [], forbids: [].}
Источник Изменить
proc formatDigits[T: Ordinal](buffer: var openArray[char]; pos: T;
                              digits: uint64; decimalExponent: int;
                              forceTrailingDotZero = false): int {.inline.}
Источник Изменить
proc hi32(x: uint64): uint32 {.inline, ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc isFinite(this: Double): bool {.noSideEffect, ...raises: [], tags: [],
                                    forbids: [].}
Источник Изменить
proc isInf(this: Double): bool {.noSideEffect, ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc isIntegralEndpoint(twoF: uint64; e2: int32; minusK: int32): bool {.inline,
    ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc isIntegralMidpoint(twoF: uint64; e2: int32; minusK: int32): bool {.inline,
    ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc isNaN(this: Double): bool {.noSideEffect, ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc isZero(this: Double): bool {.noSideEffect, ...raises: [], tags: [],
                                  forbids: [].}
Источник Изменить
proc lo32(x: uint64): uint32 {.inline, ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc mul128(a: uint64; b: uint64): uint64x2 {.inline, ...raises: [], tags: [],
    forbids: [].}
Источник Изменить
proc mulParity(twoF: uint64; pow10: uint64x2; betaMinus1: int32): bool {.inline,
    ...raises: [], tags: [], forbids: [].}
1 mulx, 1 mul Источник Изменить
proc mulShift(x: uint64; y: uint64x2): uint64 {.inline, ...raises: [], tags: [],
    forbids: [].}
2 mulx Источник Изменить
proc multipleOfPow2(value: uint64; e2: int32): bool {.inline, ...raises: [],
    tags: [], forbids: [].}
Источник Изменить
proc multipleOfPow5(value: uint64; e5: int32): bool {.inline, ...raises: [],
    tags: [], forbids: [].}
Источник Изменить
proc physicalExponent(this: Double): BitsType {.noSideEffect, ...raises: [],
    tags: [], forbids: [].}
Источник Изменить
proc physicalSignificand(this: Double): BitsType {.noSideEffect, ...raises: [],
    tags: [], forbids: [].}
Источник Изменить
proc printDecimalDigitsBackwards(buf: var openArray[char]; pos: int;
                                 output64: uint64): int {.inline, ...raises: [],
    tags: [], forbids: [].}
Источник Изменить
proc signBit(this: Double): int {.noSideEffect, ...raises: [], tags: [],
                                  forbids: [].}
Источник Изменить
proc toChars(buffer: var openArray[char]; v: float; forceTrailingDotZero = false): int {.
    inline, ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc toDecimal64(ieeeSignificand: uint64; ieeeExponent: uint64): FloatingDecimal64 {.
    inline, ...raises: [], tags: [], forbids: [].}
Источник Изменить
proc toDecimal64AsymmetricInterval(e2: int32): FloatingDecimal64 {.inline,
    ...raises: [], tags: [], forbids: [].}
NB: accept_lower_endpoint = true accept_upper_endpoint = true Источник Изменить
proc utoa8DigitsSkipTrailingZeros(buf: var openArray[char]; pos: int;
                                  digits: uint32): int {.inline, ...raises: [],
    tags: [], forbids: [].}
Источник Изменить

Шаблоны

template dragonbox_Assert(x: untyped): untyped
Источник Изменить

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/dragonbox.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API