@@ -38,7 +38,7 @@ export @uncertain
38
38
# σ_G = |σ_a·∂G/∂a|
39
39
# The list of derivatives with respect to each measurement is updated with
40
40
# ∂G/∂a · previous_derivatives
41
- @inline function result (val:: T , der:: Real , a:: Measurement{<:AbstractFloat } ) where {T<: Real }
41
+ @inline function result (val:: T , der:: Real , a:: Measurement{<:Real } ) where {T<: Real }
42
42
newder = empty_der1 (a)
43
43
@inbounds for tag in keys (a. der)
44
44
if ! iszero (tag[2 ]) # Skip values with 0 uncertainty
56
56
# Get the common type parameter of a collection of Measurement objects. The first two
57
57
# methods are for the trivial cases of homogeneous tuples and arrays, the last, inefficient,
58
58
# method is for inhomogeneous collections (probably the least common case).
59
- gettype (:: Tuple{Measurement{T}, Vararg{Measurement{T}}} ) where {T<: AbstractFloat } = T
60
- gettype (:: AbstractArray{Measurement{T}} ) where {T<: AbstractFloat } = T
61
- _eltype (:: Measurement{T} ) where {T<: AbstractFloat } = T
59
+ gettype (:: Tuple{Measurement{T}, Vararg{Measurement{T}}} ) where {T<: Real } = T
60
+ gettype (:: AbstractArray{Measurement{T}} ) where {T<: Real } = T
61
+ _eltype (:: Measurement{T} ) where {T<: Real } = T
62
62
gettype (collection) = promote_type (_eltype .(collection)... )
63
63
64
64
# This function is similar to the previous one, but applies to mathematical
@@ -249,7 +249,7 @@ function Base.:/(a::Measurement, b::Measurement)
249
249
return result (x / y, (oneovery, - x * abs2 (oneovery)), (a, b))
250
250
end
251
251
Base.:/ (a:: Real , b:: Measurement ) = result (a/ b. val, - a/ abs2 (b. val), b)
252
- Base.:/ (a:: Measurement{T} , b:: Real ) where {T<: AbstractFloat } = result (a. val/ b, 1 / T (b), a)
252
+ Base.:/ (a:: Measurement{T} , b:: Real ) where {T<: Real } = result (a. val/ b, 1 / T (b), a)
253
253
254
254
# 0.0 as partial derivative for both arguments of "div", "fld", "cld" should be
255
255
# correct for most cases. This has been tested against "@uncertain" macro.
@@ -289,7 +289,7 @@ function Base.:^(a::Measurement, b::Integer)
289
289
return result (x ^ b, b * x ^ (b - 1 ), a)
290
290
end
291
291
292
- function Base.:^ (a:: Measurement{T} , b:: Rational ) where {T<: AbstractFloat }
292
+ function Base.:^ (a:: Measurement{T} , b:: Rational ) where {T<: Real }
293
293
x = a. val
294
294
return result (x ^ b, b * x ^ (b - one (T)), a)
295
295
end
@@ -306,7 +306,7 @@ function Base.:^(a::Real, b::Measurement)
306
306
return result (res, res* log (a), b)
307
307
end
308
308
309
- function Base. exp2 (a:: Measurement{T} ) where {T<: AbstractFloat }
309
+ function Base. exp2 (a:: Measurement{T} ) where {T<: Real }
310
310
pow = exp2 (a. val)
311
311
return result (pow, pow* log (T (2 )), a)
312
312
end
@@ -411,47 +411,47 @@ end
411
411
# Inverse trig functions: acos, acosd, acosh, asin, asind, asinh, atan, atand, atanh,
412
412
# asec, acsc, acot, asech, acsch, acoth
413
413
414
- function Base. acos (a:: Measurement{T} ) where {T<: AbstractFloat }
414
+ function Base. acos (a:: Measurement{T} ) where {T<: Real }
415
415
aval = a. val
416
416
return result (acos (aval), - inv (sqrt (one (T) - abs2 (aval))), a)
417
417
end
418
418
419
- function Base. acosd (a:: Measurement{T} ) where {T<: AbstractFloat }
419
+ function Base. acosd (a:: Measurement{T} ) where {T<: Real }
420
420
aval = a. val
421
421
return result (acosd (aval), - rad2deg (inv (sqrt (one (T) - abs2 (aval)))), a)
422
422
end
423
423
424
- function Base. acosh (a:: Measurement{T} ) where {T<: AbstractFloat }
424
+ function Base. acosh (a:: Measurement{T} ) where {T<: Real }
425
425
aval = a. val
426
426
return result (acosh (aval), inv (sqrt (abs2 (aval) - one (T))), a)
427
427
end
428
428
429
- function Base. asin (a:: Measurement{T} ) where {T<: AbstractFloat }
429
+ function Base. asin (a:: Measurement{T} ) where {T<: Real }
430
430
aval = a. val
431
431
return result (asin (aval), inv (sqrt (one (T) - abs2 (aval))), a)
432
432
end
433
433
434
- function Base. asind (a:: Measurement{T} ) where {T<: AbstractFloat }
434
+ function Base. asind (a:: Measurement{T} ) where {T<: Real }
435
435
aval = a. val
436
436
return result (asind (aval), rad2deg (inv (sqrt (one (T) - abs2 (aval)))), a)
437
437
end
438
438
439
- function Base. asinh (a:: Measurement{T} ) where {T<: AbstractFloat }
439
+ function Base. asinh (a:: Measurement{T} ) where {T<: Real }
440
440
aval = a. val
441
441
return result (asinh (aval), inv (hypot (aval, one (T))), a)
442
442
end
443
443
444
- function Base. atan (a:: Measurement{T} ) where {T<: AbstractFloat }
444
+ function Base. atan (a:: Measurement{T} ) where {T<: Real }
445
445
aval = a. val
446
446
return result (atan (aval), inv (abs2 (aval) + one (T)), a)
447
447
end
448
448
449
- function Base. atand (a:: Measurement{T} ) where {T<: AbstractFloat }
449
+ function Base. atand (a:: Measurement{T} ) where {T<: Real }
450
450
aval = a. val
451
451
return result (atand (aval), rad2deg (inv (abs2 (aval) + one (T))), a)
452
452
end
453
453
454
- function Base. atanh (a:: Measurement{T} ) where {T<: AbstractFloat }
454
+ function Base. atanh (a:: Measurement{T} ) where {T<: Real }
455
455
aval = a. val
456
456
return result (atanh (aval), inv (one (T) - abs2 (aval)), a)
457
457
end
@@ -572,7 +572,7 @@ function Base.expm1(a::Measurement)
572
572
return result (expm1 (aval), exp (aval), a)
573
573
end
574
574
575
- function Base. exp10 (a:: Measurement{T} ) where {T<: AbstractFloat }
575
+ function Base. exp10 (a:: Measurement{T} ) where {T<: Real }
576
576
val = exp10 (a. val)
577
577
return result (val, log (T (10 ))* val, a)
578
578
end
@@ -582,7 +582,7 @@ function Base.frexp(a::Measurement)
582
582
return (result (x, inv (exp2 (y)), a), y)
583
583
end
584
584
585
- Base. ldexp (a:: Measurement{T} , e:: Integer ) where {T<: AbstractFloat } =
585
+ Base. ldexp (a:: Measurement{T} , e:: Integer ) where {T<: Real } =
586
586
result (ldexp (a. val, e), ldexp (one (T), e), a)
587
587
588
588
# Logarithms
@@ -600,17 +600,17 @@ function Base.log(a::Measurement) # Special case
600
600
return result (log (aval), inv (aval), a)
601
601
end
602
602
603
- function Base. log2 (a:: Measurement{T} ) where {T<: AbstractFloat } # Special case
603
+ function Base. log2 (a:: Measurement{T} ) where {T<: Real } # Special case
604
604
x = a. val
605
605
return result (log2 (x), inv (log (T (2 )) * x), a)
606
606
end
607
607
608
- function Base. log10 (a:: Measurement{T} ) where {T<: AbstractFloat } # Special case
608
+ function Base. log10 (a:: Measurement{T} ) where {T<: Real } # Special case
609
609
aval = a. val
610
610
return result (log10 (aval), inv (log (T (10 )) * aval), a)
611
611
end
612
612
613
- function Base. log1p (a:: Measurement{T} ) where {T<: AbstractFloat } # Special case
613
+ function Base. log1p (a:: Measurement{T} ) where {T<: Real } # Special case
614
614
aval = a. val
615
615
return result (log1p (aval), inv (aval + one (T)), a)
616
616
end
@@ -719,18 +719,18 @@ Base.rem2pi(a::Measurement, r::RoundingMode) = result(rem2pi(a.val, r), 1, a)
719
719
720
720
# ## Machine precision
721
721
722
- Base. eps (:: Type{Measurement{T}} ) where {T<: AbstractFloat } = eps (T)
722
+ Base. eps (:: Type{Measurement{T}} ) where {T<: Real } = eps (T)
723
723
Base. eps (a:: Measurement ) = eps (a. val)
724
724
725
725
Base. nextfloat (a:: Measurement ) = result (nextfloat (a. val), 1 , a)
726
726
Base. nextfloat (a:: Measurement , n:: Integer ) = result (nextfloat (a. val, n), 1 , a)
727
727
728
- Base. maxintfloat (:: Type{Measurement{T}} ) where {T<: AbstractFloat } = maxintfloat (T)
728
+ Base. maxintfloat (:: Type{Measurement{T}} ) where {T<: Real } = maxintfloat (T)
729
729
730
- Base. floatmin (:: Type{Measurement{T}} ) where {T<: AbstractFloat } = floatmin (T) ± zero (T)
731
- Base. floatmax (:: Type{Measurement{T}} ) where {T<: AbstractFloat } = floatmax (T) ± zero (T)
730
+ Base. floatmin (:: Type{Measurement{T}} ) where {T<: Real } = floatmin (T) ± zero (T)
731
+ Base. floatmax (:: Type{Measurement{T}} ) where {T<: Real } = floatmax (T) ± zero (T)
732
732
733
- Base. typemax (:: Type{Measurement{T}} ) where {T<: AbstractFloat } = typemax (T)
733
+ Base. typemax (:: Type{Measurement{T}} ) where {T<: Real } = typemax (T)
734
734
735
735
# ## Rounding
736
736
@@ -766,13 +766,13 @@ Base.trunc(::Type{Bool}, x::Measurement) = measurement(trunc(Bool, value(x)))
766
766
767
767
# Widening
768
768
769
- Base. widen (:: Type{Measurement{T}} ) where {T<: AbstractFloat } = Measurement{widen (T)}
769
+ Base. widen (:: Type{Measurement{T}} ) where {T<: Real } = Measurement{widen (T)}
770
770
771
771
# To big float
772
772
773
773
Base. big (:: Type{Measurement} ) = Measurement{BigFloat}
774
- Base. big (:: Type{Measurement{T}} ) where {T<: AbstractFloat } = Measurement{BigFloat}
775
- Base. big (x:: Measurement{<:AbstractFloat } ) = convert (Measurement{BigFloat}, x)
774
+ Base. big (:: Type{Measurement{T}} ) where {T<: Real } = Measurement{BigFloat}
775
+ Base. big (x:: Measurement{<:Real } ) = convert (Measurement{BigFloat}, x)
776
776
Base. big (x:: Complex{<:Measurement} ) = convert (Complex{Measurement{BigFloat}}, x)
777
777
778
778
# Sum and prod
0 commit comments