summary refs log tree commit diff stats
path: root/tests/float/tfloatmod.nim
blob: 37546a64c271b3360681c06dcf3b8f20037b1f33 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
discard """
  targets: "c cpp js"
  output: "ok"
  exitcode: "0"
"""

# Test `mod` on float64 both at compiletime and at runtime
import math

# Testdata from golang
const testValues: array[10, tuple[f64, expected: float64]] = [
  (4.9790119248836735e+00, 4.197615023265299782906368e-02),
  (7.7388724745781045e+00, 2.261127525421895434476482e+00),
  (-2.7688005719200159e-01, 3.231794108794261433104108e-02),
  (-5.0106036182710749e+00, 4.989396381728925078391512e+00),
  (9.6362937071984173e+00, 3.637062928015826201999516e-01),
  (2.9263772392439646e+00, 1.220868282268106064236690e+00),
  (5.2290834314593066e+00, 4.770916568540693347699744e+00),
  (2.7279399104360102e+00, 1.816180268691969246219742e+00),
  (1.8253080916808550e+00, 8.734595415957246977711748e-01),
  (-8.6859247685756013e+00, 1.314075231424398637614104e+00)]

const simpleTestData = [
  (5.0, 3.0, 2.0),
  (5.0, -3.0, 2.0),
  (-5.0, 3.0, -2.0),
  (-5.0, -3.0, -2.0),
  (10.0, 1.0, 0.0),
  (10.0, 0.5, 0.0),
  (10.0, 1.5, 1.0),
  (-10.0, 1.0, -0.0),
  (-10.0, 0.5, -0.0),
  (-10.0, 1.5, -1.0),
  (1.5, 1.0, 0.5),
  (1.25, 1.0, 0.25),
  (1.125, 1.0, 0.125)
  ]

const specialCases = [
  (-Inf, -Inf, Nan),
  (-Inf, -Pi, Nan),
  (-Inf, 0.0, Nan),
  (-Inf, Pi, Nan),
  (-Inf, Inf, Nan),
  (-Inf, Nan, Nan),
  (-PI, -Inf, -PI),
  (-PI, 0.0, Nan),
  (-PI, Inf, -PI),
  (-PI, Nan, Nan),
  (-0.0, -Inf, -0.0),
  (-0.0, 0.0, Nan),
  (-0.0, Inf, -0.0),
  (-0.0, Nan, Nan),
  (0.0, -Inf, 0.0),
  (0.0, 0.0, Nan),
  (0.0, Inf, 0.0),
  (0.0, Nan, Nan),
  (PI, -Inf, PI),
  (PI, 0.0, Nan),
  (PI, Inf, PI),
  (PI, Nan, Nan),
  (Inf, -Inf, Nan),
  (Inf, -PI, Nan),
  (Inf, 0.0, Nan),
  (Inf, PI, Nan),
  (Inf, Inf, Nan),
  (Inf, Nan, Nan),
  (Nan, -Inf, Nan),
  (Nan, -PI, Nan),
  (Nan, 0.0, Nan),
  (Nan, PI, Nan),
  (Nan, Inf, Nan),
  (Nan, Nan, Nan)]

const extremeValues = [
  (5.9790119248836734e+200, 1.1258465975523544, 0.6447968302508578),
  (1.0e-100, 1.0e100, 1.0e-100)]

proc errmsg(x, y, r, expected: float64): string =
  $x & " mod " & $y & " == " & $r & " but expected " & $expected

proc golangtest() =
  let x = 10.0
  for tpl in testValues:
    let (y, expected) = tpl
    let r = x mod y
    doAssert(r == expected, errmsg(x, y, r, expected))

proc simpletest() =
  for tpl in simpleTestData:
    let(x, y, expected) = tpl
    let r = x mod y
    doAssert(r == expected, errmsg(x, y, r, expected))

proc testSpecialCases() =
  proc isnan(f: float64): bool =
    case classify(f)
    of fcNan:
      result = true
    else:
      result = false

  for tpl in specialCases:
    let(x, y, expected) = tpl
    let r = x mod y
    doAssert((r == expected) or (r.isnan and expected.isnan),
              errmsg(x, y, r, expected))

proc testExtremeValues() =
  for tpl in extremeValues:
    let (x, y, expected) = tpl
    let r = x mod y
    doAssert(r == expected, errmsg(x, y, r, expected))

static:
  # compiletime evaluation
  golangtest()
  simpletest()
  testSpecialCases()
  testExtremeValues()

proc main() =
  # runtime evaluation
  golangtest()
  simpletest()
  testSpecialCases()
  testExtremeValues()

main()
echo "ok"