@@ -386,6 +386,10 @@ Base.checked_add(x::FD, y::FD) = Base.checked_add(promote(x, y)...)
386
386
Base. checked_sub (x:: FD , y:: FD ) = Base. checked_sub (promote (x, y)... )
387
387
Base. checked_mul (x:: FD , y:: FD ) = Base. checked_mul (promote (x, y)... )
388
388
Base. checked_div (x:: FD , y:: FD ) = Base. checked_div (promote (x, y)... )
389
+ Base. checked_cld (x:: FD , y:: FD ) = Base. checked_cld (promote (x, y)... )
390
+ Base. checked_fld (x:: FD , y:: FD ) = Base. checked_fld (promote (x, y)... )
391
+ Base. checked_rem (x:: FD , y:: FD ) = Base. checked_rem (promote (x, y)... )
392
+ Base. checked_mod (x:: FD , y:: FD ) = Base. checked_mod (promote (x, y)... )
389
393
390
394
Base. checked_add (x, y:: FD ) = Base. checked_add (promote (x, y)... )
391
395
Base. checked_add (x:: FD , y) = Base. checked_add (promote (x, y)... )
@@ -395,6 +399,14 @@ Base.checked_mul(x, y::FD) = Base.checked_mul(promote(x, y)...)
395
399
Base. checked_mul (x:: FD , y) = Base. checked_mul (promote (x, y)... )
396
400
Base. checked_div (x, y:: FD ) = Base. checked_div (promote (x, y)... )
397
401
Base. checked_div (x:: FD , y) = Base. checked_div (promote (x, y)... )
402
+ Base. checked_cld (x, y:: FD ) = Base. checked_cld (promote (x, y)... )
403
+ Base. checked_cld (x, y:: FD ) = Base. checked_cld (promote (x, y)... )
404
+ Base. checked_fld (x:: FD , y) = Base. checked_fld (promote (x, y)... )
405
+ Base. checked_fld (x, y:: FD ) = Base. checked_fld (promote (x, y)... )
406
+ Base. checked_rem (x:: FD , y) = Base. checked_rem (promote (x, y)... )
407
+ Base. checked_rem (x, y:: FD ) = Base. checked_rem (promote (x, y)... )
408
+ Base. checked_mod (x:: FD , y) = Base. checked_mod (promote (x, y)... )
409
+ Base. checked_mod (x, y:: FD ) = Base. checked_mod (promote (x, y)... )
398
410
399
411
function Base. checked_add (x:: T , y:: T ) where {T<: FD }
400
412
z, b = Base. add_with_overflow (x. i, y. i)
@@ -413,12 +425,33 @@ function Base.checked_mul(x::FD{T,f}, y::FD{T,f}) where {T<:Integer,f}
413
425
typemin (T) <= v <= typemax (T) || Base. Checked. throw_overflowerr_binaryop (:* , x, y)
414
426
return reinterpret (FD{T, f}, T (v))
415
427
end
416
- function Base. checked_div (x:: FD{T,f} , y:: FD{T,f} ) where {T<: Integer ,f}
417
- C = coefficient (FD{T, f})
418
- # Note: The div() will already throw for divide-by-zero and typemin(T) ÷ -1.
419
- v, b = Base. Checked. mul_with_overflow (C, div (x. i, y. i))
420
- b && Base. Checked. throw_overflowerr_binaryop (:÷ , x, y)
421
- return reinterpret (FD{T, f}, v)
428
+ # Checked division functions
429
+ for divfn in [:div , :fld , :cld ]
430
+ @eval function Base. $ (Symbol (" checked_$divfn " ))(x:: FD{T,f} , y:: FD{T,f} ) where {T<: Integer ,f}
431
+ C = coefficient (FD{T, f})
432
+ # Note: The div() will already throw for divide-by-zero and typemin(T) ÷ -1.
433
+ v, b = Base. Checked. mul_with_overflow (C, $ divfn (x. i, y. i))
434
+ b && _throw_overflowerr_op ($ (QuoteNode (divfn)), x, y)
435
+ return reinterpret (FD{T, f}, v)
436
+ end
437
+ end
438
+ for remfn in [:rem , :mod ]
439
+ # rem and mod already check for divide-by-zero and typemin(T) ÷ -1, so nothing to do.
440
+ @eval Base.$ (Symbol (" checked_$remfn " ))(x:: T , y:: T ) where {T <: FD } = $ remfn (x, y)
441
+ end
442
+
443
+ _throw_overflowerr_op (op, x:: T , y:: T ) where T = throw (OverflowError (" $op ($x , $y ) overflowed for type $T " ))
444
+
445
+ function Base. checked_neg (x:: T ) where {T<: FD }
446
+ r = - x
447
+ (x< 0 ) & (r< 0 ) && Base. Checked. throw_overflowerr_negation (x)
448
+ return r
449
+ end
450
+ function Base. checked_abs (x:: FD )
451
+ r = ifelse (x< 0 , - x, x)
452
+ r< 0 || return r
453
+ msg = LazyString (" checked arithmetic: cannot compute |x| for x = " , x, " ::" , typeof (x))
454
+ throw (OverflowError (msg))
422
455
end
423
456
424
457
# We introduce a new function for this since Base.Checked only supports integers, and ints
0 commit comments