Skip to content

Commit 7be3e9a

Browse files
committed
Functora.Round fix for non-positive numbers
1 parent 5a81556 commit 7be3e9a

File tree

2 files changed

+99
-11
lines changed

2 files changed

+99
-11
lines changed

pub/functora/src/round/Functora/Round.hs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
{-# LANGUAGE MultiWayIf #-}
2+
13
-- |
24
-- Module: Functora.Round
35
--
@@ -132,12 +134,15 @@ dpRound n f
132134
-- 0 % 1
133135
sdRound :: (RealFrac a) => Natural -> a -> a
134136
sdRound sd' f =
135-
if m < 0
136-
then dpRound sd gZ / 10 ^^ pZ
137-
else case compare n 0 of
138-
EQ -> dpRound n f
139-
GT -> dpRound n f
140-
LT -> 10 ^^ p * fromInteger (round g)
137+
if
138+
| f == 0 -> f
139+
| f < 0 -> negate . sdRound sd' $ abs f
140+
| m < 0 -> dpRound sd gZ / 10 ^^ pZ
141+
| otherwise ->
142+
case compare n 0 of
143+
EQ -> dpRound n f
144+
GT -> dpRound n f
145+
LT -> 10 ^^ p * fromInteger (round g)
141146
where
142147
sd = toInteger sd'
143148

pub/functora/src/test/Functora/RoundSpec.hs

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Data.Fixed (E12, Fixed)
44
--
55
-- NOTE : Round functions will fail for FixNonNeg because of impl details.
66
--
7-
import Functora.Prelude (Fix, throw, throwString, try)
7+
import Functora.Prelude (E30, Fix, throw, throwString, try)
88
import Functora.Round (dpRound, sdRound)
99
import Numeric.Natural (Natural)
1010
import System.Exit (ExitCode (..))
@@ -29,12 +29,14 @@ spec = do
2929
"src/round/Functora/Round.hs"
3030
]
3131

32-
mkRoundSpec @(Fixed E12) "dpRound/Fixed" dpRound dpRoundTestData
32+
mkRoundSpec @(Fixed E30) "dpRound/Fixed/E30" dpRound dpRoundTestData
33+
mkRoundSpec @(Fixed E12) "dpRound/Fixed/E12" dpRound dpRoundTestData
3334
mkRoundSpec @Rational "dpRound/Rational" dpRound dpRoundTestData
3435
mkRoundSpec @Double "dpRound/Double" dpRound dpRoundTestData
3536
mkRoundSpec @Fix "dpRound/Fix" dpRound dpRoundTestData
3637

37-
mkRoundSpec @(Fixed E12) "sdRound/Fixed" sdRound sdRoundTestData
38+
mkRoundSpec @(Fixed E30) "sdRound/Fixed/E30" sdRound sdRoundTestData
39+
mkRoundSpec @(Fixed E12) "sdRound/Fixed/E12" sdRound sdRoundTestData
3840
mkRoundSpec @Rational "sdRound/Rational" sdRound sdRoundTestData
3941
mkRoundSpec @Double "sdRound/Double" sdRound sdRoundTestData
4042
mkRoundSpec @Fix "sdRound/Fix" sdRound sdRoundTestData
@@ -173,7 +175,54 @@ dpRoundTestData =
173175
(6, 1.23456789, 1.234568),
174176
(6, 0.123456789, 0.123457),
175177
(6, 0.0123456789, 0.012346),
176-
(6, 0.00123456789, 0.001235)
178+
(6, 0.00123456789, 0.001235),
179+
(6, 0, 0),
180+
(2, -123456789.0, -123456789.0),
181+
(2, -1234.56789, -1234.57),
182+
(2, -123.456789, -123.46),
183+
(2, -12.3456789, -12.35),
184+
(2, -1.23456789, -1.23),
185+
(2, -0.123456789, -0.12),
186+
(2, -0.0123456789, -0.01),
187+
(2, -0.00123456789, -0.00),
188+
(3, -123456789.0, -123456789.0),
189+
(3, -1234.56789, -1234.568),
190+
(3, -123.456789, -123.457),
191+
(3, -12.3456789, -12.346),
192+
(3, -1.23456789, -1.235),
193+
(3, -0.123456789, -0.123),
194+
(3, -0.0123456789, -0.012),
195+
(3, -0.00123456789, -0.001),
196+
(3, -0.000123456789, -0.000),
197+
(4, -123456789.0, -123456789.0),
198+
(4, -1234.56789, -1234.5679),
199+
(4, -123.456789, -123.4568),
200+
(4, -12.3456789, -12.3457),
201+
(4, -1.23456789, -1.2346),
202+
(4, -0.123456789, -0.1235),
203+
(4, -0.0123456789, -0.0123),
204+
(4, -0.00123456789, -0.0012),
205+
(4, -0.000123456789, -0.0001),
206+
(4, -0.0000123456789, -0.0000),
207+
(5, -123456789.0, -123456789.0),
208+
(5, -1234.56789, -1234.56789),
209+
(5, -123.456789, -123.45679),
210+
(5, -12.3456789, -12.34568),
211+
(5, -1.23456789, -1.23457),
212+
(5, -0.123456789, -0.12346),
213+
(5, -0.0123456789, -0.01235),
214+
(5, -0.00123456789, -0.00123),
215+
(5, -0.000123456789, -0.00012),
216+
(5, -0.0000123456789, -0.00001),
217+
(5, -0.00000123456789, -0.0),
218+
(6, -123456789.0, -123456789.0),
219+
(6, -1234.56789, -1234.56789),
220+
(6, -123.456789, -123.456789),
221+
(6, -12.3456789, -12.345679),
222+
(6, -1.23456789, -1.234568),
223+
(6, -0.123456789, -0.123457),
224+
(6, -0.0123456789, -0.012346),
225+
(6, -0.00123456789, -0.001235)
177226
]
178227

179228
-- | Every element is a tuple (significantDigits, beforeRound, afterRound)
@@ -211,5 +260,39 @@ sdRoundTestData =
211260
(7, 123.456789, 123.4568),
212261
(7, 12.3456789, 12.34568),
213262
(7, 1.23456789, 1.234568),
214-
(7, 0.123456789, 0.1234568)
263+
(7, 0.123456789, 0.1234568),
264+
(7, 0, 0),
265+
(4, -123456789.0, -123500000.0),
266+
(4, -1234.56789, -1235.0),
267+
(4, -123.456789, -123.5),
268+
(4, -12.3456789, -12.35),
269+
(4, -1.23456789, -1.235),
270+
(4, -0.123456789, -0.1235),
271+
(4, -0.0123456789, -0.01235),
272+
(4, -0.00123456789, -0.001235),
273+
(4, -0.000123456789, -0.0001235),
274+
(5, -123456789.0, -123460000.0),
275+
(5, -1234.56789, -1234.6),
276+
(5, -123.456789, -123.46),
277+
(5, -12.3456789, -12.346),
278+
(5, -1.23456789, -1.2346),
279+
(5, -0.123456789, -0.12346),
280+
(5, -0.0123456789, -0.012346),
281+
(5, -0.00123456789, -0.0012346),
282+
(5, -0.000123456789, -0.00012346),
283+
(6, -123456789.0, -123457000.0),
284+
(6, -1234.56789, -1234.57),
285+
(6, -123.456789, -123.457),
286+
(6, -12.3456789, -12.3457),
287+
(6, -1.23456789, -1.23457),
288+
(6, -0.123456789, -0.123457),
289+
(6, -0.0123456789, -0.0123457),
290+
(6, -0.00123456789, -0.00123457),
291+
(6, -0.000123456789, -0.000123457),
292+
(7, -123456789.0, -123456800.0),
293+
(7, -1234.56789, -1234.568),
294+
(7, -123.456789, -123.4568),
295+
(7, -12.3456789, -12.34568),
296+
(7, -1.23456789, -1.234568),
297+
(7, -0.123456789, -0.1234568)
215298
]

0 commit comments

Comments
 (0)