@@ -5,6 +5,17 @@ defmodule FloatTest do
5
5
6
6
doctest Float
7
7
8
+ # TODO remove and replace by assert once we require Erlang/OTP 27+
9
+ # We can't easily distinguish between -0.0 and +0.0 on previous version
10
+ defmacrop float_assert ( { :=== , _ , [ left , right ] } ) do
11
+ quote do
12
+ # note: these are pure functions so no need to use bind_quoted
13
+ # we favor a useful error message instead
14
+ assert unquote ( left ) === unquote ( right )
15
+ assert to_string ( unquote ( left ) ) === to_string ( unquote ( right ) )
16
+ end
17
+ end
18
+
8
19
test "parse/1" do
9
20
assert Float . parse ( "12" ) === { 12.0 , "" }
10
21
assert Float . parse ( "-12" ) === { - 12.0 , "" }
@@ -45,153 +56,153 @@ defmodule FloatTest do
45
56
end
46
57
47
58
test "floor/1" do
48
- assert Float . floor ( 12.524235 ) === 12.0
49
- assert Float . floor ( - 12.5 ) === - 13.0
50
- assert Float . floor ( - 12.524235 ) === - 13.0
51
- assert Float . floor ( 7.5e3 ) === 7500.0
52
- assert Float . floor ( 7.5432e3 ) === 7543.0
53
- assert Float . floor ( 7.5e-3 ) === 0.0
54
- assert Float . floor ( - 12.32453e4 ) === - 123_246.0
55
- assert Float . floor ( - 12.32453e-10 ) === - 1.0
56
- assert Float . floor ( 0.32453e-10 ) === 0.0
57
- assert Float . floor ( - 0.32453e-10 ) === - 1.0
58
- assert Float . floor ( 1.32453e-10 ) === 0.0
59
+ float_assert Float . floor ( 12.524235 ) === 12.0
60
+ float_assert Float . floor ( - 12.5 ) === - 13.0
61
+ float_assert Float . floor ( - 12.524235 ) === - 13.0
62
+ float_assert Float . floor ( 7.5e3 ) === 7500.0
63
+ float_assert Float . floor ( 7.5432e3 ) === 7543.0
64
+ float_assert Float . floor ( 7.5e-3 ) === 0.0
65
+ float_assert Float . floor ( - 12.32453e4 ) === - 123_246.0
66
+ float_assert Float . floor ( - 12.32453e-10 ) === - 1.0
67
+ float_assert Float . floor ( 0.32453e-10 ) === 0.0
68
+ float_assert Float . floor ( - 0.32453e-10 ) === - 1.0
69
+ float_assert Float . floor ( 1.32453e-10 ) === 0.0
59
70
end
60
71
61
72
describe "floor/2" do
62
73
test "with 0.0" do
63
74
for precision <- 0 .. 15 do
64
- assert Float . floor ( 0.0 , precision ) === 0.0
65
- assert Float . floor ( - 0.0 , precision ) === - 0.0
75
+ float_assert Float . floor ( 0.0 , precision ) === 0.0
76
+ float_assert Float . floor ( - 0.0 , precision ) === - 0.0
66
77
end
67
78
end
68
79
69
80
test "floor/2 with precision" do
70
- assert Float . floor ( 12.524235 , 0 ) === 12.0
71
- assert Float . floor ( - 12.524235 , 0 ) === - 13.0
81
+ float_assert Float . floor ( 12.524235 , 0 ) === 12.0
82
+ float_assert Float . floor ( - 12.524235 , 0 ) === - 13.0
72
83
73
- assert Float . floor ( 12.52 , 2 ) === 12.51
74
- assert Float . floor ( - 12.52 , 2 ) === - 12.52
84
+ float_assert Float . floor ( 12.52 , 2 ) === 12.51
85
+ float_assert Float . floor ( - 12.52 , 2 ) === - 12.52
75
86
76
- assert Float . floor ( 12.524235 , 2 ) === 12.52
77
- assert Float . floor ( - 12.524235 , 3 ) === - 12.525
87
+ float_assert Float . floor ( 12.524235 , 2 ) === 12.52
88
+ float_assert Float . floor ( - 12.524235 , 3 ) === - 12.525
78
89
79
- assert Float . floor ( 12.32453e-20 , 2 ) === 0.0
80
- assert Float . floor ( - 12.32453e-20 , 2 ) === - 0.01
90
+ float_assert Float . floor ( 12.32453e-20 , 2 ) === 0.0
91
+ float_assert Float . floor ( - 12.32453e-20 , 2 ) === - 0.01
81
92
82
93
assert_raise ArgumentError , "precision 16 is out of valid range of 0..15" , fn ->
83
94
Float . floor ( 1.1 , 16 )
84
95
end
85
96
end
86
97
87
98
test "with subnormal floats" do
88
- assert Float . floor ( - 5.0e-324 , 0 ) === - 1.0
89
- assert Float . floor ( - 5.0e-324 , 1 ) === - 0.1
90
- assert Float . floor ( - 5.0e-324 , 2 ) === - 0.01
91
- assert Float . floor ( - 5.0e-324 , 15 ) === - 0.000000000000001
99
+ float_assert Float . floor ( - 5.0e-324 , 0 ) === - 1.0
100
+ float_assert Float . floor ( - 5.0e-324 , 1 ) === - 0.1
101
+ float_assert Float . floor ( - 5.0e-324 , 2 ) === - 0.01
102
+ float_assert Float . floor ( - 5.0e-324 , 15 ) === - 0.000000000000001
92
103
93
104
for precision <- 0 .. 15 do
94
- assert Float . floor ( 5.0e-324 , precision ) === 0.0
105
+ float_assert Float . floor ( 5.0e-324 , precision ) === 0.0
95
106
end
96
107
end
97
108
end
98
109
99
110
test "ceil/1" do
100
- assert Float . ceil ( 12.524235 ) === 13.0
101
- assert Float . ceil ( - 12.5 ) === - 12.0
102
- assert Float . ceil ( - 12.524235 ) === - 12.0
103
- assert Float . ceil ( 7.5e3 ) === 7500.0
104
- assert Float . ceil ( 7.5432e3 ) === 7544.0
105
- assert Float . ceil ( 7.5e-3 ) === 1.0
106
- assert Float . ceil ( - 12.32453e4 ) === - 123_245.0
107
- assert Float . ceil ( - 12.32453e-10 ) === - 0.0
108
- assert Float . ceil ( 0.32453e-10 ) === 1.0
109
- assert Float . ceil ( - 0.32453e-10 ) === - 0.0
110
- assert Float . ceil ( 1.32453e-10 ) === 1.0
111
- assert Float . ceil ( 0.0 ) === 0.0
111
+ float_assert Float . ceil ( 12.524235 ) === 13.0
112
+ float_assert Float . ceil ( - 12.5 ) === - 12.0
113
+ float_assert Float . ceil ( - 12.524235 ) === - 12.0
114
+ float_assert Float . ceil ( 7.5e3 ) === 7500.0
115
+ float_assert Float . ceil ( 7.5432e3 ) === 7544.0
116
+ float_assert Float . ceil ( 7.5e-3 ) === 1.0
117
+ float_assert Float . ceil ( - 12.32453e4 ) === - 123_245.0
118
+ float_assert Float . ceil ( - 12.32453e-10 ) === - 0.0
119
+ float_assert Float . ceil ( 0.32453e-10 ) === 1.0
120
+ float_assert Float . ceil ( - 0.32453e-10 ) === - 0.0
121
+ float_assert Float . ceil ( 1.32453e-10 ) === 1.0
122
+ float_assert Float . ceil ( 0.0 ) === 0.0
112
123
end
113
124
114
125
describe "ceil/2" do
115
126
test "with 0.0" do
116
127
for precision <- 0 .. 15 do
117
- assert Float . ceil ( 0.0 , precision ) === 0.0
118
- assert Float . ceil ( - 0.0 , precision ) === - 0.0
128
+ float_assert Float . ceil ( 0.0 , precision ) === 0.0
129
+ float_assert Float . ceil ( - 0.0 , precision ) === - 0.0
119
130
end
120
131
end
121
132
122
133
test "with regular floats" do
123
- assert Float . ceil ( 12.524235 , 0 ) === 13.0
124
- assert Float . ceil ( - 12.524235 , 0 ) === - 12.0
134
+ float_assert Float . ceil ( 12.524235 , 0 ) === 13.0
135
+ float_assert Float . ceil ( - 12.524235 , 0 ) === - 12.0
125
136
126
- assert Float . ceil ( 12.52 , 2 ) === 12.52
127
- assert Float . ceil ( - 12.52 , 2 ) === - 12.51
137
+ float_assert Float . ceil ( 12.52 , 2 ) === 12.52
138
+ float_assert Float . ceil ( - 12.52 , 2 ) === - 12.51
128
139
129
- assert Float . ceil ( 12.524235 , 2 ) === 12.53
130
- assert Float . ceil ( - 12.524235 , 3 ) === - 12.524
140
+ float_assert Float . ceil ( 12.524235 , 2 ) === 12.53
141
+ float_assert Float . ceil ( - 12.524235 , 3 ) === - 12.524
131
142
132
- assert Float . ceil ( 12.32453e-20 , 2 ) === 0.01
133
- assert Float . ceil ( - 12.32453e-20 , 2 ) === - 0.0
143
+ float_assert Float . ceil ( 12.32453e-20 , 2 ) === 0.01
144
+ float_assert Float . ceil ( - 12.32453e-20 , 2 ) === - 0.0
134
145
135
- assert Float . ceil ( 0.0 , 2 ) === 0.0
146
+ float_assert Float . ceil ( 0.0 , 2 ) === 0.0
136
147
137
148
assert_raise ArgumentError , "precision 16 is out of valid range of 0..15" , fn ->
138
149
Float . ceil ( 1.1 , 16 )
139
150
end
140
151
end
141
152
142
153
test "with small floats rounded up to -0.0" do
143
- assert Float . ceil ( - 0.1 , 0 ) === - 0.0
144
- assert Float . ceil ( - 0.01 , 1 ) === - 0.0
154
+ float_assert Float . ceil ( - 0.1 , 0 ) === - 0.0
155
+ float_assert Float . ceil ( - 0.01 , 1 ) === - 0.0
145
156
end
146
157
147
158
test "with subnormal floats" do
148
- assert Float . ceil ( 5.0e-324 , 0 ) === 1.0
149
- assert Float . ceil ( 5.0e-324 , 1 ) === 0.1
150
- assert Float . ceil ( 5.0e-324 , 2 ) === 0.01
151
- assert Float . ceil ( 5.0e-324 , 15 ) === 0.000000000000001
159
+ float_assert Float . ceil ( 5.0e-324 , 0 ) === 1.0
160
+ float_assert Float . ceil ( 5.0e-324 , 1 ) === 0.1
161
+ float_assert Float . ceil ( 5.0e-324 , 2 ) === 0.01
162
+ float_assert Float . ceil ( 5.0e-324 , 15 ) === 0.000000000000001
152
163
153
164
for precision <- 0 .. 15 do
154
- assert Float . ceil ( - 5.0e-324 , precision ) === - 0.0
165
+ float_assert Float . ceil ( - 5.0e-324 , precision ) === - 0.0
155
166
end
156
167
end
157
168
end
158
169
159
170
describe "round/2" do
160
171
test "with 0.0" do
161
172
for precision <- 0 .. 15 do
162
- assert Float . round ( 0.0 , precision ) === 0.0
163
- assert Float . round ( - 0.0 , precision ) === - 0.0
173
+ float_assert Float . round ( 0.0 , precision ) === 0.0
174
+ float_assert Float . round ( - 0.0 , precision ) === - 0.0
164
175
end
165
176
end
166
177
167
178
test "with regular floats" do
168
- assert Float . round ( 5.5675 , 3 ) === 5.567
169
- assert Float . round ( - 5.5674 , 3 ) === - 5.567
170
- assert Float . round ( 5.5 , 3 ) === 5.5
171
- assert Float . round ( 5.5e-10 , 10 ) === 5.0e-10
172
- assert Float . round ( 5.5e-10 , 8 ) === 0.0
173
- assert Float . round ( 5.0 , 0 ) === 5.0
179
+ float_assert Float . round ( 5.5675 , 3 ) === 5.567
180
+ float_assert Float . round ( - 5.5674 , 3 ) === - 5.567
181
+ float_assert Float . round ( 5.5 , 3 ) === 5.5
182
+ float_assert Float . round ( 5.5e-10 , 10 ) === 5.0e-10
183
+ float_assert Float . round ( 5.5e-10 , 8 ) === 0.0
184
+ float_assert Float . round ( 5.0 , 0 ) === 5.0
174
185
175
186
assert_raise ArgumentError , "precision 16 is out of valid range of 0..15" , fn ->
176
187
Float . round ( 1.1 , 16 )
177
188
end
178
189
end
179
190
180
191
test "with small floats rounded to +0.0 / -0.0" do
181
- assert Float . round ( 0.01 , 0 ) === 0.0
182
- assert Float . round ( 0.01 , 1 ) === 0.0
192
+ float_assert Float . round ( 0.01 , 0 ) === 0.0
193
+ float_assert Float . round ( 0.01 , 1 ) === 0.0
183
194
184
- assert Float . round ( - 0.01 , 0 ) === - 0.0
185
- assert Float . round ( - 0.01 , 1 ) === - 0.0
195
+ float_assert Float . round ( - 0.01 , 0 ) === - 0.0
196
+ float_assert Float . round ( - 0.01 , 1 ) === - 0.0
186
197
187
- assert Float . round ( - 0.49999 , 0 ) === - 0.0
188
- assert Float . round ( - 0.049999 , 1 ) === - 0.0
198
+ float_assert Float . round ( - 0.49999 , 0 ) === - 0.0
199
+ float_assert Float . round ( - 0.049999 , 1 ) === - 0.0
189
200
end
190
201
191
202
test "with subnormal floats" do
192
203
for precision <- 0 .. 15 do
193
- assert Float . round ( 5.0e-324 , precision ) === 0.0
194
- assert Float . round ( - 5.0e-324 , precision ) === - 0.0
204
+ float_assert Float . round ( 5.0e-324 , precision ) === 0.0
205
+ float_assert Float . round ( - 5.0e-324 , precision ) === - 0.0
195
206
end
196
207
end
197
208
end
0 commit comments