mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 09:24:36 +00:00
Merge branch 'patch-8' of https://github.com/apense/Nim into apense-patch-8
This commit is contained in:
@@ -145,21 +145,28 @@ proc randomize*(seed: int) {.benign.}
|
||||
|
||||
{.push noSideEffect.}
|
||||
when not defined(JS):
|
||||
proc sqrt*(x: float): float {.importc: "sqrt", header: "<math.h>".}
|
||||
proc sqrt*(x: float32): float32 {.importc: "sqrtf", header: "<math.h>".}
|
||||
proc sqrt*(x: float64): float64 {.importc: "sqrt", header: "<math.h>".}
|
||||
## Computes the square root of `x`.
|
||||
proc cbrt*(x: float): float {.importc: "cbrt", header: "<math.h>".}
|
||||
proc cbrt*(x: float32): float32 {.importc: "cbrtf", header: "<math.h>".}
|
||||
proc cbrt*(x: float64): float64 {.importc: "cbrt", header: "<math.h>".}
|
||||
## Computes the cubic root of `x`
|
||||
|
||||
proc ln*(x: float): float {.importc: "log", header: "<math.h>".}
|
||||
proc ln*(x: float32): float32 {.importc: "logf", header: "<math.h>".}
|
||||
proc ln*(x: float64): float64 {.importc: "log", header: "<math.h>".}
|
||||
## Computes the natural log of `x`
|
||||
proc log10*(x: float): float {.importc: "log10", header: "<math.h>".}
|
||||
proc log10*(x: float32): float32 {.importc: "log10f", header: "<math.h>".}
|
||||
proc log10*(x: float64): float64 {.importc: "log10", header: "<math.h>".}
|
||||
## Computes the common logarithm (base 10) of `x`
|
||||
proc log2*(x: float): float = return ln(x) / ln(2.0)
|
||||
proc log2*[T: float32|float64](x: T): T = return ln(x) / ln(2.0)
|
||||
## Computes the binary logarithm (base 2) of `x`
|
||||
proc exp*(x: float): float {.importc: "exp", header: "<math.h>".}
|
||||
proc exp*(x: float32): float32 {.importc: "expf", header: "<math.h>".}
|
||||
proc exp*(x: float64): float64 {.importc: "exp", header: "<math.h>".}
|
||||
## Computes the exponential function of `x` (pow(E, x))
|
||||
|
||||
proc frexp*(x: float, exponent: var int): float {.
|
||||
proc frexp*(x: float32, exponent: var int): float32 {.
|
||||
importc: "frexp", header: "<math.h>".}
|
||||
proc frexp*(x: float64, exponent: var int): float64 {.
|
||||
importc: "frexp", header: "<math.h>".}
|
||||
## Split a number into mantissa and exponent.
|
||||
## `frexp` calculates the mantissa m (a float greater than or equal to 0.5
|
||||
@@ -167,48 +174,69 @@ when not defined(JS):
|
||||
## float value) equals m * 2**n. frexp stores n in `exponent` and returns
|
||||
## m.
|
||||
|
||||
proc round*(x: float): int {.importc: "lrint", header: "<math.h>".}
|
||||
## Converts a float to an int by rounding.
|
||||
proc round*(x: float32): int {.importc: "lrintf", header: "<math.h>".}
|
||||
proc round*(x: float64): int {.importc: "lrint", header: "<math.h>".}
|
||||
## converts a float to an int by rounding.
|
||||
|
||||
proc arccos*(x: float): float {.importc: "acos", header: "<math.h>".}
|
||||
proc arccos*(x: float32): float32 {.importc: "acosf", header: "<math.h>".}
|
||||
proc arccos*(x: float64): float64 {.importc: "acos", header: "<math.h>".}
|
||||
## Computes the arc cosine of `x`
|
||||
proc arcsin*(x: float): float {.importc: "asin", header: "<math.h>".}
|
||||
proc arcsin*(x: float32): float32 {.importc: "asinf", header: "<math.h>".}
|
||||
proc arcsin*(x: float64): float64 {.importc: "asin", header: "<math.h>".}
|
||||
## Computes the arc sine of `x`
|
||||
proc arctan*(x: float): float {.importc: "atan", header: "<math.h>".}
|
||||
proc arctan*(x: float32): float32 {.importc: "atanf", header: "<math.h>".}
|
||||
proc arctan*(x: float64): float64 {.importc: "atan", header: "<math.h>".}
|
||||
## Calculate the arc tangent of `y` / `x`
|
||||
proc arctan2*(y, x: float): float {.importc: "atan2", header: "<math.h>".}
|
||||
proc arctan2*(y, x: float32): float32 {.importc: "atan2f", header: "<math.h>".}
|
||||
proc arctan2*(y, x: float64): float64 {.importc: "atan2", header: "<math.h>".}
|
||||
## Calculate the arc tangent of `y` / `x`.
|
||||
## `atan2` returns the arc tangent of `y` / `x`; it produces correct
|
||||
## results even when the resulting angle is near pi/2 or -pi/2
|
||||
## (`x` near 0).
|
||||
|
||||
proc cos*(x: float): float {.importc: "cos", header: "<math.h>".}
|
||||
proc cos*(x: float32): float32 {.importc: "cosf", header: "<math.h>".}
|
||||
proc cos*(x: float64): float64 {.importc: "cos", header: "<math.h>".}
|
||||
## Computes the cosine of `x`
|
||||
proc cosh*(x: float): float {.importc: "cosh", header: "<math.h>".}
|
||||
|
||||
proc cosh*(x: float32): float32 {.importc: "coshf", header: "<math.h>".}
|
||||
proc cosh*(x: float64): float64 {.importc: "cosh", header: "<math.h>".}
|
||||
## Computes the hyperbolic cosine of `x`
|
||||
proc hypot*(x, y: float): float {.importc: "hypot", header: "<math.h>".}
|
||||
|
||||
proc hypot*(x, y: float32): float32 {.importc: "hypotf", header: "<math.h>".}
|
||||
proc hypot*(x, y: float64): float64 {.importc: "hypot", header: "<math.h>".}
|
||||
## Computes the hypotenuse of a right-angle triangle with `x` and
|
||||
## `y` as its base and height. Equivalent to ``sqrt(x*x + y*y)``.
|
||||
|
||||
proc sinh*(x: float): float {.importc: "sinh", header: "<math.h>".}
|
||||
proc sinh*(x: float32): float32 {.importc: "sinhf", header: "<math.h>".}
|
||||
proc sinh*(x: float64): float64 {.importc: "sinh", header: "<math.h>".}
|
||||
## Computes the hyperbolic sine of `x`
|
||||
proc sin*(x: float): float {.importc: "sin", header: "<math.h>".}
|
||||
proc sin*(x: float32): float32 {.importc: "sinf", header: "<math.h>".}
|
||||
proc sin*(x: float64): float64 {.importc: "sin", header: "<math.h>".}
|
||||
## Computes the sine of `x`
|
||||
proc tan*(x: float): float {.importc: "tan", header: "<math.h>".}
|
||||
## Computes the tangent of `x`
|
||||
proc tanh*(x: float): float {.importc: "tanh", header: "<math.h>".}
|
||||
## Computes the hyperbolic tangent of `x`
|
||||
proc pow*(x, y: float): float {.importc: "pow", header: "<math.h>".}
|
||||
## Computes `x` to power of `y`.
|
||||
|
||||
proc erf*(x: float): float {.importc: "erf", header: "<math.h>".}
|
||||
proc tan*(x: float32): float32 {.importc: "tanf", header: "<math.h>".}
|
||||
proc tan*(x: float64): float64 {.importc: "tan", header: "<math.h>".}
|
||||
## Computes the tangent of `x`
|
||||
proc tanh*(x: float32): float32 {.importc: "tanhf", header: "<math.h>".}
|
||||
proc tanh*(x: float64): float64 {.importc: "tanh", header: "<math.h>".}
|
||||
## Computes the hyperbolic tangent of `x`
|
||||
|
||||
proc pow*(x, y: float32): float32 {.importc: "powf", header: "<math.h>".}
|
||||
proc pow*(x, y: float64): float64 {.importc: "pow", header: "<math.h>".}
|
||||
## computes x to power raised of y.
|
||||
|
||||
proc erf*(x: float32): float32 {.importc: "erff", header: "<math.h>".}
|
||||
proc erf*(x: float64): float64 {.importc: "erf", header: "<math.h>".}
|
||||
## The error function
|
||||
proc erfc*(x: float): float {.importc: "erfc", header: "<math.h>".}
|
||||
proc erfc*(x: float32): float32 {.importc: "erfcf", header: "<math.h>".}
|
||||
proc erfc*(x: float64): float64 {.importc: "erfc", header: "<math.h>".}
|
||||
## The complementary error function
|
||||
|
||||
proc lgamma*(x: float): float {.importc: "lgamma", header: "<math.h>".}
|
||||
proc lgamma*(x: float32): float32 {.importc: "lgammaf", header: "<math.h>".}
|
||||
proc lgamma*(x: float64): float64 {.importc: "lgamma", header: "<math.h>".}
|
||||
## Natural log of the gamma function
|
||||
proc tgamma*(x: float): float {.importc: "tgamma", header: "<math.h>".}
|
||||
proc tgamma*(x: float32): float32 {.importc: "tgammaf", header: "<math.h>".}
|
||||
proc tgamma*(x: float64): float64 {.importc: "tgamma", header: "<math.h>".}
|
||||
## The gamma function
|
||||
|
||||
# C procs:
|
||||
@@ -262,23 +290,29 @@ when not defined(JS):
|
||||
proc random(max: int): int =
|
||||
result = int(rand()) mod max
|
||||
|
||||
proc trunc*(x: float): float {.importc: "trunc", header: "<math.h>".}
|
||||
proc trunc*(x: float32): float32 {.importc: "truncf", header: "<math.h>".}
|
||||
proc trunc*(x: float64): float64 {.importc: "trunc", header: "<math.h>".}
|
||||
## Truncates `x` to the decimal point
|
||||
##
|
||||
## .. code-block:: nim
|
||||
## echo trunc(PI) # 3.0
|
||||
proc floor*(x: float): float {.importc: "floor", header: "<math.h>".}
|
||||
|
||||
proc floor*(x: float32): float32 {.importc: "floorf", header: "<math.h>".}
|
||||
proc floor*(x: float64): float64 {.importc: "floor", header: "<math.h>".}
|
||||
## Computes the floor function (i.e., the largest integer not greater than `x`)
|
||||
##
|
||||
## .. code-block:: nim
|
||||
## echo floor(-3.5) ## -4.0
|
||||
proc ceil*(x: float): float {.importc: "ceil", header: "<math.h>".}
|
||||
|
||||
proc ceil*(x: float32): float32 {.importc: "ceilf", header: "<math.h>".}
|
||||
proc ceil*(x: float64): float64 {.importc: "ceil", header: "<math.h>".}
|
||||
## Computes the ceiling function (i.e., the smallest integer not less than `x`)
|
||||
##
|
||||
## .. code-block:: nim
|
||||
## echo ceil(-2.1) ## -2.0
|
||||
|
||||
proc fmod*(x, y: float): float {.importc: "fmod", header: "<math.h>".}
|
||||
proc fmod*(x, y: float32): float32 {.importc: "fmodf", header: "<math.h>".}
|
||||
proc fmod*(x, y: float64): float64 {.importc: "fmod", header: "<math.h>".}
|
||||
## Computes the remainder of `x` divided by `y`
|
||||
##
|
||||
## .. code-block:: nim
|
||||
@@ -286,8 +320,10 @@ when not defined(JS):
|
||||
|
||||
else:
|
||||
proc mathrandom(): float {.importc: "Math.random", nodecl.}
|
||||
proc floor*(x: float): float {.importc: "Math.floor", nodecl.}
|
||||
proc ceil*(x: float): float {.importc: "Math.ceil", nodecl.}
|
||||
proc floor*(x: float32): float32 {.importc: "Math.floor", nodecl.}
|
||||
proc floor*(x: float64): float64 {.importc: "Math.floor", nodecl.}
|
||||
proc ceil*(x: float32): float32 {.importc: "Math.ceil", nodecl.}
|
||||
proc ceil*(x: float64): float64 {.importc: "Math.ceil", nodecl.}
|
||||
proc random(max: int): int =
|
||||
result = int(floor(mathrandom() * float(max)))
|
||||
proc random(max: float): float =
|
||||
@@ -295,16 +331,21 @@ else:
|
||||
proc randomize() = discard
|
||||
proc randomize(seed: int) = discard
|
||||
|
||||
proc sqrt*(x: float): float {.importc: "Math.sqrt", nodecl.}
|
||||
proc ln*(x: float): float {.importc: "Math.log", nodecl.}
|
||||
proc log10*(x: float): float = return ln(x) / ln(10.0)
|
||||
proc log2*(x: float): float = return ln(x) / ln(2.0)
|
||||
proc sqrt*(x: float32): float32 {.importc: "Math.sqrt", nodecl.}
|
||||
proc sqrt*(x: float64): float64 {.importc: "Math.sqrt", nodecl.}
|
||||
proc ln*(x: float32): float32 {.importc: "Math.log", nodecl.}
|
||||
proc ln*(x: float64): float64 {.importc: "Math.log", nodecl.}
|
||||
proc log10*[T: float32|float64](x: T): T = return ln(x) / ln(10.0)
|
||||
proc log2*[T: float32|float64](x: T): T = return ln(x) / ln(2.0)
|
||||
|
||||
proc exp*(x: float): float {.importc: "Math.exp", nodecl.}
|
||||
proc exp*(x: float32): float32 {.importc: "Math.exp", nodecl.}
|
||||
proc exp*(x: float64): float64 {.importc: "Math.exp", nodecl.}
|
||||
proc round*(x: float): int {.importc: "Math.round", nodecl.}
|
||||
proc pow*(x, y: float): float {.importc: "Math.pow", nodecl.}
|
||||
|
||||
proc frexp*(x: float, exponent: var int): float =
|
||||
proc pow*(x, y: float32): float32 {.importC: "Math.pow", nodecl.}
|
||||
proc pow*(x, y: float64): float64 {.importc: "Math.pow", nodecl.}
|
||||
|
||||
proc frexp*[T: float32|float64](x: T, exponent: var int): T =
|
||||
if x == 0.0:
|
||||
exponent = 0
|
||||
result = 0.0
|
||||
@@ -315,18 +356,26 @@ else:
|
||||
exponent = round(ex)
|
||||
result = x / pow(2.0, ex)
|
||||
|
||||
proc arccos*(x: float): float {.importc: "Math.acos", nodecl.}
|
||||
proc arcsin*(x: float): float {.importc: "Math.asin", nodecl.}
|
||||
proc arctan*(x: float): float {.importc: "Math.atan", nodecl.}
|
||||
proc arctan2*(y, x: float): float {.importc: "Math.atan2", nodecl.}
|
||||
proc arccos*(x: float32): float32 {.importc: "Math.acos", nodecl.}
|
||||
proc arccos*(x: float64): float64 {.importc: "Math.acos", nodecl.}
|
||||
proc arcsin*(x: float32): float32 {.importc: "Math.asin", nodecl.}
|
||||
proc arcsin*(x: float64): float64 {.importc: "Math.asin", nodecl.}
|
||||
proc arctan*(x: float32): float32 {.importc: "Math.atan", nodecl.}
|
||||
proc arctan*(x: float64): float64 {.importc: "Math.atan", nodecl.}
|
||||
proc arctan2*(y, x: float32): float32 {.importC: "Math.atan2", nodecl.}
|
||||
proc arctan2*(y, x: float64): float64 {.importc: "Math.atan2", nodecl.}
|
||||
|
||||
proc cos*(x: float): float {.importc: "Math.cos", nodecl.}
|
||||
proc cosh*(x: float): float = return (exp(x)+exp(-x))*0.5
|
||||
proc hypot*(x, y: float): float = return sqrt(x*x + y*y)
|
||||
proc sinh*(x: float): float = return (exp(x)-exp(-x))*0.5
|
||||
proc sin*(x: float): float {.importc: "Math.sin", nodecl.}
|
||||
proc tan*(x: float): float {.importc: "Math.tan", nodecl.}
|
||||
proc tanh*(x: float): float =
|
||||
proc cos*(x: float32): float32 {.importc: "Math.cos", nodecl.}
|
||||
proc cos*(x: float64): float64 {.importc: "Math.cos", nodecl.}
|
||||
proc cosh*(x: float32): float32 = return (exp(x)+exp(-x))*0.5
|
||||
proc cosh*(x: float64): float64 = return (exp(x)+exp(-x))*0.5
|
||||
proc hypot*[T: float32|float64](x, y: T): T = return sqrt(x*x + y*y)
|
||||
proc sinh*[T: float32|float64](x: T): T = return (exp(x)-exp(-x))*0.5
|
||||
proc sin*(x: float32): float32 {.importc: "Math.sin", nodecl.}
|
||||
proc sin*(x: float64): float64 {.importc: "Math.sin", nodecl.}
|
||||
proc tan*(x: float32): float32 {.importc: "Math.tan", nodecl.}
|
||||
proc tan*(x: float64): float64 {.importc: "Math.tan", nodecl.}
|
||||
proc tanh*[T: float32|float64](x: T): T =
|
||||
var y = exp(2.0*x)
|
||||
return (y-1.0)/(y+1.0)
|
||||
|
||||
@@ -340,7 +389,7 @@ proc radToDeg*[T: float32|float64](d: T): T {.inline.} =
|
||||
## Convert from radians to degrees
|
||||
result = T(d) / RadPerDeg
|
||||
|
||||
proc `mod`*(x, y: float): float =
|
||||
proc `mod`*[T: float32|float64](x, y: T): T =
|
||||
## Computes the modulo operation for float operators. Equivalent
|
||||
## to ``x - y * floor(x/y)``. Note that the remainder will always
|
||||
## have the same sign as the divisor.
|
||||
|
||||
Reference in New Issue
Block a user