diff options
author | def <dennis@felsin9.de> | 2014-08-06 02:31:15 +0200 |
---|---|---|
committer | def <dennis@felsin9.de> | 2014-08-06 02:31:19 +0200 |
commit | c0422ae8afc8daff021a299b1879d08b15e50df3 (patch) | |
tree | 6f88bf78ff4674a82bf2e55b0dd8a0e6020dfb03 /lib/pure | |
parent | 2476ee0cd7e64ea84b83ebdd728ed46609bff633 (diff) | |
download | Nim-c0422ae8afc8daff021a299b1879d08b15e50df3.tar.gz |
Move floating point rounding and exceptions handling to math
(it's C99 as well, not just POSIX)
Diffstat (limited to 'lib/pure')
-rw-r--r-- | lib/pure/math.nim | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/pure/math.nim b/lib/pure/math.nim index 2f7a696b9..cc774539d 100644 --- a/lib/pure/math.nim +++ b/lib/pure/math.nim @@ -40,6 +40,19 @@ const ## after the decimal point ## for Nimrod's ``float`` type. +var + FE_DIVBYZERO* {.importc, header: "<fenv.h>".}: cint + FE_INEXACT* {.importc, header: "<fenv.h>".}: cint + FE_INVALID* {.importc, header: "<fenv.h>".}: cint + FE_OVERFLOW* {.importc, header: "<fenv.h>".}: cint + FE_UNDERFLOW* {.importc, header: "<fenv.h>".}: cint + FE_ALL_EXCEPT* {.importc, header: "<fenv.h>".}: cint + FE_DOWNWARD* {.importc, header: "<fenv.h>".}: cint + FE_TONEAREST* {.importc, header: "<fenv.h>".}: cint + FE_TOWARDZERO* {.importc, header: "<fenv.h>".}: cint + FE_UPWARD* {.importc, header: "<fenv.h>".}: cint + FE_DFL_ENV* {.importc, header: "<fenv.h>".}: cint + type TFloatClass* = enum ## describes the class a floating point value belongs to. ## This is the type that is returned by `classify`. @@ -51,6 +64,22 @@ type fcInf, ## value is positive infinity fcNegInf ## value is negative infinity + Tfenv* {.importc: "fenv_t", header: "<fenv.h>", final, pure.} = + object ## Represents the entire floating-point environment. The + ## floating-point environment refers collectively to any + ## floating-point status flags and control modes supported + ## by the implementation. + Tfexcept* {.importc: "fexcept_t", header: "<fenv.h>", final, pure.} = + object ## Represents the floating-point status flags collectively, + ## including any status the implementation associates with the + ## flags. A floating-point status flag is a system variable + ## whose value is set (but never cleared) when a floating-point + ## exception is raised, which occurs as a side effect of + ## exceptional floating-point arithmetic to provide auxiliary + ## information. A floating-point control mode is a system variable + ## whose value may be set by the user to affect the subsequent + ## behavior of floating-point arithmetic. + proc classify*(x: float): TFloatClass = ## classifies a floating point value. Returns `x`'s class as specified by ## `TFloatClass`. @@ -321,6 +350,20 @@ proc standardDeviation*(s: TRunningStat): float = ## computes the current standard deviation of `s` result = sqrt(variance(s)) +proc feclearexcept*(a1: cint): cint {.importc, header: "<fenv.h>".} +proc fegetexceptflag*(a1: ptr Tfexcept, a2: cint): cint {. + importc, header: "<fenv.h>".} +proc feraiseexcept*(a1: cint): cint {.importc, header: "<fenv.h>".} +proc fesetexceptflag*(a1: ptr Tfexcept, a2: cint): cint {. + importc, header: "<fenv.h>".} +proc fetestexcept*(a1: cint): cint {.importc, header: "<fenv.h>".} +proc fegetround*(): cint {.importc, header: "<fenv.h>".} +proc fesetround*(a1: cint): cint {.importc, header: "<fenv.h>".} +proc fegetenv*(a1: ptr Tfenv): cint {.importc, header: "<fenv.h>".} +proc feholdexcept*(a1: ptr Tfenv): cint {.importc, header: "<fenv.h>".} +proc fesetenv*(a1: ptr Tfenv): cint {.importc, header: "<fenv.h>".} +proc feupdateenv*(a1: ptr Tfenv): cint {.importc, header: "<fenv.h>".} + {.pop.} {.pop.} |