11module Quadmath
2- using Requires
32using Compat: @assume_effects
43
54export Float128, ComplexF128, Inf128
@@ -42,7 +41,7 @@ elseif Sys.iswindows()
4241 const libquadmath = " libquadmath-0.dll"
4342end
4443
45- macro ccall (expr)
44+ macro quad_ccall (expr)
4645 @assert expr isa Expr && expr. head == :(:: )
4746 ret_type = expr. args[2 ]
4847
@@ -116,13 +115,6 @@ reinterpret(::Type{Int128}, x::Float128) =
116115reinterpret (:: Type{Float128} , x:: Int128 ) =
117116 reinterpret (Float128, reinterpret (UInt128, x))
118117
119- function __init__ ()
120- @require SpecialFunctions= " 276daf66-3868-5448-9aa4-cd146d93841b" begin
121- include (" specfun.jl" )
122- end
123- end
124-
125-
126118sign_mask (:: Type{Float128} ) = 0x8000_0000_0000_0000_0000_0000_0000_0000
127119exponent_mask (:: Type{Float128} ) = 0x7fff_0000_0000_0000_0000_0000_0000_0000
128120exponent_one (:: Type{Float128} ) = 0x3fff_0000_0000_0000_0000_0000_0000_0000
@@ -147,15 +139,15 @@ Float128(x::Float128) = x
147139
148140# Float64
149141@assume_effects :foldable Float128 (x:: Float64 ) =
150- Float128 (@ccall (quadoplib. __extenddftf2 (x:: Cdouble ):: Cfloat128 ))
142+ Float128 (@quad_ccall (quadoplib. __extenddftf2 (x:: Cdouble ):: Cfloat128 ))
151143@assume_effects :foldable Float64 (x:: Float128 ) =
152- @ccall (quadoplib. __trunctfdf2 (x:: Cfloat128 ):: Cdouble )
144+ @quad_ccall (quadoplib. __trunctfdf2 (x:: Cfloat128 ):: Cdouble )
153145
154146# Float32
155147@assume_effects :foldable Float128 (x:: Float32 ) =
156- Float128 (@ccall (quadoplib. __extendsftf2 (x:: Cfloat ):: Cfloat128 ))
148+ Float128 (@quad_ccall (quadoplib. __extendsftf2 (x:: Cfloat ):: Cfloat128 ))
157149@assume_effects :foldable Float32 (x:: Float128 ) =
158- @ccall (quadoplib. __trunctfsf2 (x:: Cfloat128 ):: Cfloat )
150+ @quad_ccall (quadoplib. __trunctfsf2 (x:: Cfloat128 ):: Cfloat )
159151
160152# Float16
161153Float128 (x:: Float16 ) = Float128 (Float32 (x))
@@ -167,16 +159,16 @@ Float128(x::Base.TwicePrecision{Float64}) =
167159
168160# integer -> Float128
169161@assume_effects :foldable Float128 (x:: Int32 ) =
170- Float128 (@ccall (quadoplib. __floatsitf (x:: Int32 ):: Cfloat128 ))
162+ Float128 (@quad_ccall (quadoplib. __floatsitf (x:: Int32 ):: Cfloat128 ))
171163
172164@assume_effects :foldable Float128 (x:: UInt32 ) =
173- Float128 (@ccall (quadoplib. __floatunsitf (x:: UInt32 ):: Cfloat128 ))
165+ Float128 (@quad_ccall (quadoplib. __floatunsitf (x:: UInt32 ):: Cfloat128 ))
174166
175167@assume_effects :foldable Float128 (x:: Int64 ) =
176- Float128 (@ccall (quadoplib. __floatditf (x:: Int64 ):: Cfloat128 ))
168+ Float128 (@quad_ccall (quadoplib. __floatditf (x:: Int64 ):: Cfloat128 ))
177169
178170@assume_effects :foldable Float128 (x:: UInt64 ) =
179- Float128 (@ccall (quadoplib. __floatunditf (x:: UInt64 ):: Cfloat128 ))
171+ Float128 (@quad_ccall (quadoplib. __floatunditf (x:: UInt64 ):: Cfloat128 ))
180172
181173Float128 (x:: Int16 ) = Float128 (Int32 (x))
182174Float128 (x:: Int8 ) = Float128 (Int32 (x))
@@ -238,37 +230,37 @@ Float128(x::Bool) = x ? Float128(1) : Float128(0)
238230
239231# Comparison
240232@assume_effects :foldable (== )(x:: Float128 , y:: Float128 ) =
241- @ccall (quadoplib. __eqtf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) == 0
233+ @quad_ccall (quadoplib. __eqtf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) == 0
242234@assume_effects :foldable (< )(x:: Float128 , y:: Float128 ) =
243- @ccall (quadoplib. __letf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) == - 1
235+ @quad_ccall (quadoplib. __letf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) == - 1
244236@assume_effects :foldable (<= )(x:: Float128 , y:: Float128 ) =
245- @ccall (quadoplib. __letf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) <= 0
237+ @quad_ccall (quadoplib. __letf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) <= 0
246238
247239# Arithmetic
248240@assume_effects :foldable (+ )(x:: Float128 , y:: Float128 ) =
249- Float128 (@ccall (quadoplib. __addtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
241+ Float128 (@quad_ccall (quadoplib. __addtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
250242@assume_effects :foldable (- )(x:: Float128 , y:: Float128 ) =
251- Float128 (@ccall (quadoplib. __subtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
243+ Float128 (@quad_ccall (quadoplib. __subtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
252244@assume_effects :foldable (* )(x:: Float128 , y:: Float128 ) =
253- Float128 (@ccall (quadoplib. __multf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
245+ Float128 (@quad_ccall (quadoplib. __multf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
254246@assume_effects :foldable (/ )(x:: Float128 , y:: Float128 ) =
255- Float128 (@ccall (quadoplib. __divtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
247+ Float128 (@quad_ccall (quadoplib. __divtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
256248
257249@assume_effects :foldable (- )(x:: Float128 ) =
258- Float128 (@ccall (quadoplib. __negtf2 (x:: Cfloat128 ):: Cfloat128 ))
250+ Float128 (@quad_ccall (quadoplib. __negtf2 (x:: Cfloat128 ):: Cfloat128 ))
259251
260252# Float128 -> Integer
261253@assume_effects :foldable unsafe_trunc (:: Type{Int32} , x:: Float128 ) =
262- @ccall (quadoplib. __fixtfsi (x:: Cfloat128 ):: Int32 )
254+ @quad_ccall (quadoplib. __fixtfsi (x:: Cfloat128 ):: Int32 )
263255
264256@assume_effects :foldable unsafe_trunc (:: Type{Int64} , x:: Float128 ) =
265- @ccall (quadoplib. __fixtfdi (x:: Cfloat128 ):: Int64 )
257+ @quad_ccall (quadoplib. __fixtfdi (x:: Cfloat128 ):: Int64 )
266258
267259@assume_effects :foldable unsafe_trunc (:: Type{UInt32} , x:: Float128 ) =
268- @ccall (quadoplib. __fixunstfsi (x:: Cfloat128 ):: UInt32 )
260+ @quad_ccall (quadoplib. __fixunstfsi (x:: Cfloat128 ):: UInt32 )
269261
270262@assume_effects :foldable unsafe_trunc (:: Type{UInt64} , x:: Float128 ) =
271- @ccall (quadoplib. __fixunstfdi (x:: Cfloat128 ):: UInt64 )
263+ @quad_ccall (quadoplib. __fixunstfdi (x:: Cfloat128 ):: UInt64 )
272264
273265function unsafe_trunc (:: Type{UInt128} , x:: Float128 )
274266 xu = reinterpret (UInt128,x)
@@ -340,19 +332,19 @@ for f in (:acos, :acosh, :asin, :asinh, :atan, :atanh, :cosh, :cos,
340332 :sin , :sinh , :sqrt , :tan , :tanh ,
341333 :ceil , :floor , :trunc , )
342334 @eval @assume_effects :foldable function $f (x:: Float128 )
343- Float128 (@ccall (libquadmath.$ (string (f,:q ))(x:: Cfloat128 ):: Cfloat128 ))
335+ Float128 (@quad_ccall (libquadmath.$ (string (f,:q ))(x:: Cfloat128 ):: Cfloat128 ))
344336 end
345337end
346338
347- @assume_effects :foldable abs (x:: Float128 ) = Float128 (@ccall (libquadmath. fabsq (x:: Cfloat128 ):: Cfloat128 ))
348- @assume_effects :foldable round (x:: Float128 ) = Float128 (@ccall (libquadmath. rintq (x:: Cfloat128 ):: Cfloat128 ))
339+ @assume_effects :foldable abs (x:: Float128 ) = Float128 (@quad_ccall (libquadmath. fabsq (x:: Cfloat128 ):: Cfloat128 ))
340+ @assume_effects :foldable round (x:: Float128 ) = Float128 (@quad_ccall (libquadmath. rintq (x:: Cfloat128 ):: Cfloat128 ))
349341round (x:: Float128 , r:: RoundingMode{:Down} ) = floor (x)
350342round (x:: Float128 , r:: RoundingMode{:Up} ) = ceil (x)
351343round (x:: Float128 , r:: RoundingMode{:ToZero} ) = round (x)
352344
353345# # two argument
354346@assume_effects :foldable (^ )(x:: Float128 , y:: Float128 ) =
355- Float128 (@ccall (libquadmath. powq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
347+ Float128 (@quad_ccall (libquadmath. powq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
356348
357349# circumvent a failure in Base
358350function (^ )(x:: Float128 , p:: Integer )
@@ -363,15 +355,15 @@ function (^)(x::Float128, p::Integer)
363355 end
364356end
365357@assume_effects :foldable copysign (x:: Float128 , y:: Float128 ) =
366- Float128 (@ccall (libquadmath. copysignq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
358+ Float128 (@quad_ccall (libquadmath. copysignq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
367359@assume_effects :foldable hypot (x:: Float128 , y:: Float128 ) =
368- Float128 (@ccall (libquadmath. hypotq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
360+ Float128 (@quad_ccall (libquadmath. hypotq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
369361@assume_effects :foldable atan (x:: Float128 , y:: Float128 ) =
370- Float128 (@ccall (libquadmath. atan2q (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
362+ Float128 (@quad_ccall (libquadmath. atan2q (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
371363
372364Base. Integer (x:: Float128 ) = Int (x)
373365@assume_effects :foldable Base. rem (x:: Float128 , y:: Float128 ) =
374- Float128 (@ccall (libquadmath. remainderq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
366+ Float128 (@quad_ccall (libquadmath. remainderq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
375367
376368sincos (x:: Float128 ) = (sin (x), cos (x))
377369
@@ -380,12 +372,12 @@ sincos(x::Float128) = (sin(x), cos(x))
380372 # disable fma on Windows until rounding mode issue fixed
381373 # https://github.com/JuliaMath/Quadmath.jl/issues/31
382374 @assume_effects :foldable fma (x:: Float128 , y:: Float128 , z:: Float128 ) =
383- Float128 (@ccall (libquadmath. fmaq (x:: Cfloat128 , y:: Cfloat128 , z:: Cfloat128 ):: Cfloat128 ))
375+ Float128 (@quad_ccall (libquadmath. fmaq (x:: Cfloat128 , y:: Cfloat128 , z:: Cfloat128 ):: Cfloat128 ))
384376end
385377
386- @assume_effects :foldable isnan (x:: Float128 ) = 0 != @ccall (libquadmath. isnanq (x:: Cfloat128 ):: Cint )
387- @assume_effects :foldable isinf (x:: Float128 ) = 0 != @ccall (libquadmath. isinfq (x:: Cfloat128 ):: Cint )
388- @assume_effects :foldable isfinite (x:: Float128 ) = 0 != @ccall (libquadmath. finiteq (x:: Cfloat128 ):: Cint )
378+ @assume_effects :foldable isnan (x:: Float128 ) = 0 != @quad_ccall (libquadmath. isnanq (x:: Cfloat128 ):: Cint )
379+ @assume_effects :foldable isinf (x:: Float128 ) = 0 != @quad_ccall (libquadmath. isinfq (x:: Cfloat128 ):: Cint )
380+ @assume_effects :foldable isfinite (x:: Float128 ) = 0 != @quad_ccall (libquadmath. finiteq (x:: Cfloat128 ):: Cint )
389381
390382isinteger (x:: Float128 ) = isfinite (x) && x === trunc (x)
391383
@@ -410,14 +402,14 @@ typemax(::Type{Float128}) = Inf128
410402typemin (:: Type{Float128} ) = - Inf128
411403
412404@assume_effects :foldable ldexp (x:: Float128 , n:: Cint ) =
413- Float128 (@ccall (libquadmath. ldexpq (x:: Cfloat128 , n:: Cint ):: Cfloat128 ))
405+ Float128 (@quad_ccall (libquadmath. ldexpq (x:: Cfloat128 , n:: Cint ):: Cfloat128 ))
414406ldexp (x:: Float128 , n:: Integer ) =
415407 ldexp (x, clamp (n, typemin (Cint), typemax (Cint)) % Cint)
416408
417409
418410@assume_effects :foldable function frexp (x:: Float128 )
419411 ri = Ref {Cint} ()
420- f = Float128 (@ccall (libquadmath. frexpq (x:: Cfloat128 , ri:: Ptr{Cint} ):: Cfloat128 ))
412+ f = Float128 (@quad_ccall (libquadmath. frexpq (x:: Cfloat128 , ri:: Ptr{Cint} ):: Cfloat128 ))
421413 return f, Int (ri[])
422414end
423415
@@ -621,13 +613,13 @@ end
621613
622614# TODO : need to do this better
623615function parse (:: Type{Float128} , s:: AbstractString )
624- Float128 (@ccall (libquadmath. strtoflt128 (s:: Cstring , C_NULL :: Ptr{Ptr{Cchar}} ):: Cfloat128 ))
616+ Float128 (@quad_ccall (libquadmath. strtoflt128 (s:: Cstring , C_NULL :: Ptr{Ptr{Cchar}} ):: Cfloat128 ))
625617end
626618
627619function string (x:: Float128 )
628620 lng = 64
629621 buf = Array {UInt8} (undef, lng + 1 )
630- lng = @ccall (libquadmath. quadmath_snprintf (buf:: Ptr{UInt8} , (lng+ 1 ):: Csize_t , " %.35Qe" :: Ptr{UInt8} , x:: (Cfloat128...) ):: Cint )
622+ lng = @quad_ccall (libquadmath. quadmath_snprintf (buf:: Ptr{UInt8} , (lng+ 1 ):: Csize_t , " %.35Qe" :: Ptr{UInt8} , x:: (Cfloat128...) ):: Cint )
631623 return String (resize! (buf, lng))
632624end
633625
@@ -636,4 +628,7 @@ show(io::IO, b::Float128) = print(io, string(b))
636628
637629include (" printf.jl" )
638630
631+ if ! isdefined (Base, :get_extension )
632+ include (" ../ext/QuadmathSpecialFunctionsExt.jl" )
633+ end
639634end # module Quadmath
0 commit comments