Changeset 8054
- Timestamp:
- 12/03/05 07:06:08 (3 years ago)
- svk:copy_cache_prev:
- 10519
- Files:
-
- 2 modified
-
src/Pugs/Prim/Numeric.hs (modified) (2 diffs)
-
t/operators/arith.t (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Prim/Numeric.hs
r7579 r8054 61 61 if isDigit . head $ show (num1 :: VNum) 62 62 then op2Rat ((^^) :: VRat -> VInt -> VRat) x y 63 else op2Num ((**) :: VNum -> VNum -> VNum) x y 64 _ -> op2Num ((**) :: VNum -> VNum -> VNum) x y 63 else op2Num numExp x y 64 _ -> op2Num numExp x y 65 where 66 numExp :: VNum -> VNum -> VNum 67 -- Perl 6 differs from Haskell in the floating point spec wrt Infinity and NaN 68 numExp x y 69 | x == 1/0 && y == 0 = 0/0 70 | x == 0 && y < 0 = 0/0 71 | y == 1/0 && (x == 1 || x <= -1) = 0/0 72 | y == -1/0 && (x == 1 || (x >= -1 && x <= 0)) = 0/0 73 | otherwise = x ** y 65 74 66 75 op2Divide :: Val -> Val -> Eval Val … … 77 86 = op2Num (/) x y 78 87 where 79 err = fail "Illegal division by zero" 88 err = fail "Illegal division by zero" -- XXX why not NaN? 80 89 81 90 op2Modulus :: Val -> Val -> Eval Val -
t/operators/arith.t
r7792 r8054 4 4 use Test; 5 5 6 plan 1 85;6 plan 196; 7 7 8 8 my $five = abs(-5); … … 311 311 is Inf/Inf, NaN; 312 312 is Inf*Inf/Inf, NaN; 313 is Inf**0, 1;314 313 is 0**Inf, 0; 315 314 … … 324 323 is 0.9**Inf, 0, "0.9**Inf converges towards 0"; 325 324 is 1.1**Inf, Inf, "1.1**Inf diverges towards Inf"; 326 is 1**Inf, 1 , :todo("1**Inf == 1"); 325 # this next one is arguable 326 is 1**Inf, NaN, "1**Inf depends on the functions in the limit (unless 1 is considered an int)"; 327 # but this next one isn't 328 is 1.0**Inf, NaN, "1.0**Inf depends on the functions in the limit"; 329 is (-1)**Inf, NaN, "(-1)**Inf is indeterminate for the same reason"; 330 is (-1.1)**Inf, NaN, "(-2)**Inf is indeterminate between -Inf and Inf"; 331 is (-0.9)**Inf, 0, "(-0.9)**Inf oscillates but always converges to 0"; 332 333 is 0.9**(-Inf), Inf, "0.9**-Inf diverges towards Inf"; 334 is 1.1**(-Inf), 0, "1.1**-Inf converges to 0"; 335 is 1**(-Inf), NaN, "1**Inf depends on the functions in the limit"; 336 is 1.0**(-Inf), NaN, "1.0**Inf depends on the functions in the limit"; 337 is (-1)**(-Inf), NaN, "(-1)**-Inf is indeterminate"; 338 is (-1.1)**(-Inf), 0, "(-1.1)**-Inf converges to 0"; 339 is (-0.9)**(-Inf), NaN, "(0.9)**-Inf oscillates and diverges"; 340 341 is Inf**0, NaN; 327 342 328 343 #fail("1**Inf is platform-specific -- it's 1 on OSX and NaN elsewhere", :todo);
