stdlib organization & documentation improvements (#20971)

* stdlib organization & documentation improvements

* fix CI

* Update doc/lib.md

Co-authored-by: Juan Carlos <juancarlospaco@gmail.com>

* fix ci, remove jshttpcore, export in jsfetch instead

* fix alphabetical order violations

* add cmdline, db_odbc

Co-authored-by: Juan Carlos <juancarlospaco@gmail.com>
This commit is contained in:
metagn 2022-12-06 11:37:03 +03:00 • committed by GitHub
commit 739e1badb6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 167 additions and 53 deletions

View file

@ -0,0 +1,51 @@
#
#
# Nim's Runtime Library
# (c) Copyright 2015 Nim Contributors
# See the file "copying.txt", included in this
# distribution, for details about the copyright.
## The [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister)
## random number generator.
## .. note:: The procs in this module work at compile-time.
{.deprecated: "use `std/random` instead".}
runnableExamples:
var rand = newMersenneTwister(uint32.high) ## must be "var"
doAssert rand.getNum() != rand.getNum() ## pseudorandom number
## See also
## ========
## * `random module<random.html>`_ for Nim's standard random number generator
type
MersenneTwister* = object
## The Mersenne Twister.
mt: array[0..623, uint32]
index: int
proc newMersenneTwister*(seed: uint32): MersenneTwister =
## Creates a new `MersenneTwister` with seed `seed`.
result.index = 0
result.mt[0] = seed
for i in 1'u32 .. 623'u32:
result.mt[i] = (0x6c078965'u32 * (result.mt[i-1] xor
(result.mt[i-1] shr 30'u32)) + i)
proc generateNumbers(m: var MersenneTwister) =
for i in 0..623:
var y = (m.mt[i] and 0x80000000'u32) +
(m.mt[(i+1) mod 624] and 0x7fffffff'u32)
m.mt[i] = m.mt[(i+397) mod 624] xor uint32(y shr 1'u32)
if (y mod 2'u32) != 0:
m.mt[i] = m.mt[i] xor 0x9908b0df'u32
proc getNum*(m: var MersenneTwister): uint32 =
## Returns the next pseudorandom `uint32`.
if m.index == 0:
generateNumbers(m)
result = m.mt[m.index]
m.index = (m.index + 1) mod m.mt.len
result = result xor (result shr 11'u32)
result = result xor ((result shl 7'u32) and 0x9d2c5680'u32)
result = result xor ((result shl 15'u32) and 0xefc60000'u32)
result = result xor (result shr 18'u32)

View file

@ -0,0 +1,13 @@
#
#
# Nim's Runtime Library
# (c) Copyright 2015 Andreas Rumpf
#
# See the file "copying.txt", included in this
# distribution, for details about the copyright.
#
## This module is deprecated, `import os` instead.
{.deprecated: "import os.nim instead".}
import os
export PathComponent, walkDir, walkDirRec

View file

@ -0,0 +1,80 @@
#
#
# Nim's Runtime Library
# (c) Copyright 2019 b3liever
#
# See the file "copying.txt", included in this
# distribution, for details about the copyright.
## Accurate summation functions.
{.deprecated: "use the nimble package `sums` instead.".}
runnableExamples:
import std/math
template `~=`(x, y: float): bool = abs(x - y) < 1e-4
let
n = 1_000_000
first = 1e10
small = 0.1
var data = @[first]
for _ in 1 .. n:
data.add(small)
let result = first + small * n.float
doAssert abs(sum(data) - result) > 0.3
doAssert sumKbn(data) ~= result
doAssert sumPairs(data) ~= result
## See also
## ========
## * `math module <math.html>`_ for a standard `sum proc <math.html#sum,openArray[T]>`_
func sumKbn*[T](x: openArray[T]): T =
## Kahan-Babuška-Neumaier summation: O(1) error growth, at the expense
## of a considerable increase in computational cost.
##
## See:
## * https://en.wikipedia.org/wiki/Kahan_summation_algorithm#Further_enhancements
if len(x) == 0: return
var sum = x[0]
var c = T(0)
for i in 1 ..< len(x):
let xi = x[i]
let t = sum + xi
if abs(sum) >= abs(xi):
c += (sum - t) + xi
else:
c += (xi - t) + sum
sum = t
result = sum + c
func sumPairwise[T](x: openArray[T], i0, n: int): T =
if n < 128:
result = x[i0]
for i in i0 + 1 ..< i0 + n:
result += x[i]
else:
let n2 = n div 2
result = sumPairwise(x, i0, n2) + sumPairwise(x, i0 + n2, n - n2)
func sumPairs*[T](x: openArray[T]): T =
## Pairwise (cascade) summation of `x[i0:i0+n-1]`, with O(log n) error growth
## (vs O(n) for a simple loop) with negligible performance cost if
## the base case is large enough.
##
## See, e.g.:
## * https://en.wikipedia.org/wiki/Pairwise_summation
## * Higham, Nicholas J. (1993), "The accuracy of floating point
## summation", SIAM Journal on Scientific Computing 14 (4): 783–799.
##
## In fact, the root-mean-square error growth, assuming random roundoff
## errors, is only O(sqrt(log n)), which is nearly indistinguishable from O(1)
## in practice. See:
## * Manfred Tasche and Hansmartin Zeuner, Handbook of
## Analytic-Computational Methods in Applied Mathematics (2000).
let n = len(x)
if n == 0: T(0) else: sumPairwise(x, 0, n)