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"). Вывод _не завершается нулём.
Вывод является оптимальным, т.е. строка вывода
округляется до входного числа при чтении (с использованием округления до ближайшего чётного) является максимально короткой, является максимально близкой к входному числу. Примечание: эта функция может временно записать до 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 Типы Константы Процедуры 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 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: [].} Источник Изменить Шаблоны