1
1
module Quadmath
2
- using Requires
3
2
using Compat: @assume_effects
4
3
5
4
export Float128, ComplexF128, Inf128
@@ -42,7 +41,7 @@ elseif Sys.iswindows()
42
41
const libquadmath = " libquadmath-0.dll"
43
42
end
44
43
45
- macro ccall (expr)
44
+ macro quad_ccall (expr)
46
45
@assert expr isa Expr && expr. head == :(:: )
47
46
ret_type = expr. args[2 ]
48
47
@@ -116,13 +115,6 @@ reinterpret(::Type{Int128}, x::Float128) =
116
115
reinterpret (:: Type{Float128} , x:: Int128 ) =
117
116
reinterpret (Float128, reinterpret (UInt128, x))
118
117
119
- function __init__ ()
120
- @require SpecialFunctions= " 276daf66-3868-5448-9aa4-cd146d93841b" begin
121
- include (" specfun.jl" )
122
- end
123
- end
124
-
125
-
126
118
sign_mask (:: Type{Float128} ) = 0x8000_0000_0000_0000_0000_0000_0000_0000
127
119
exponent_mask (:: Type{Float128} ) = 0x7fff_0000_0000_0000_0000_0000_0000_0000
128
120
exponent_one (:: Type{Float128} ) = 0x3fff_0000_0000_0000_0000_0000_0000_0000
@@ -147,15 +139,15 @@ Float128(x::Float128) = x
147
139
148
140
# Float64
149
141
@assume_effects :foldable Float128 (x:: Float64 ) =
150
- Float128 (@ccall (quadoplib. __extenddftf2 (x:: Cdouble ):: Cfloat128 ))
142
+ Float128 (@quad_ccall (quadoplib. __extenddftf2 (x:: Cdouble ):: Cfloat128 ))
151
143
@assume_effects :foldable Float64 (x:: Float128 ) =
152
- @ccall (quadoplib. __trunctfdf2 (x:: Cfloat128 ):: Cdouble )
144
+ @quad_ccall (quadoplib. __trunctfdf2 (x:: Cfloat128 ):: Cdouble )
153
145
154
146
# Float32
155
147
@assume_effects :foldable Float128 (x:: Float32 ) =
156
- Float128 (@ccall (quadoplib. __extendsftf2 (x:: Cfloat ):: Cfloat128 ))
148
+ Float128 (@quad_ccall (quadoplib. __extendsftf2 (x:: Cfloat ):: Cfloat128 ))
157
149
@assume_effects :foldable Float32 (x:: Float128 ) =
158
- @ccall (quadoplib. __trunctfsf2 (x:: Cfloat128 ):: Cfloat )
150
+ @quad_ccall (quadoplib. __trunctfsf2 (x:: Cfloat128 ):: Cfloat )
159
151
160
152
# Float16
161
153
Float128 (x:: Float16 ) = Float128 (Float32 (x))
@@ -167,16 +159,16 @@ Float128(x::Base.TwicePrecision{Float64}) =
167
159
168
160
# integer -> Float128
169
161
@assume_effects :foldable Float128 (x:: Int32 ) =
170
- Float128 (@ccall (quadoplib. __floatsitf (x:: Int32 ):: Cfloat128 ))
162
+ Float128 (@quad_ccall (quadoplib. __floatsitf (x:: Int32 ):: Cfloat128 ))
171
163
172
164
@assume_effects :foldable Float128 (x:: UInt32 ) =
173
- Float128 (@ccall (quadoplib. __floatunsitf (x:: UInt32 ):: Cfloat128 ))
165
+ Float128 (@quad_ccall (quadoplib. __floatunsitf (x:: UInt32 ):: Cfloat128 ))
174
166
175
167
@assume_effects :foldable Float128 (x:: Int64 ) =
176
- Float128 (@ccall (quadoplib. __floatditf (x:: Int64 ):: Cfloat128 ))
168
+ Float128 (@quad_ccall (quadoplib. __floatditf (x:: Int64 ):: Cfloat128 ))
177
169
178
170
@assume_effects :foldable Float128 (x:: UInt64 ) =
179
- Float128 (@ccall (quadoplib. __floatunditf (x:: UInt64 ):: Cfloat128 ))
171
+ Float128 (@quad_ccall (quadoplib. __floatunditf (x:: UInt64 ):: Cfloat128 ))
180
172
181
173
Float128 (x:: Int16 ) = Float128 (Int32 (x))
182
174
Float128 (x:: Int8 ) = Float128 (Int32 (x))
@@ -238,37 +230,37 @@ Float128(x::Bool) = x ? Float128(1) : Float128(0)
238
230
239
231
# Comparison
240
232
@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
242
234
@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
244
236
@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
246
238
247
239
# Arithmetic
248
240
@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 ))
250
242
@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 ))
252
244
@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 ))
254
246
@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 ))
256
248
257
249
@assume_effects :foldable (- )(x:: Float128 ) =
258
- Float128 (@ccall (quadoplib. __negtf2 (x:: Cfloat128 ):: Cfloat128 ))
250
+ Float128 (@quad_ccall (quadoplib. __negtf2 (x:: Cfloat128 ):: Cfloat128 ))
259
251
260
252
# Float128 -> Integer
261
253
@assume_effects :foldable unsafe_trunc (:: Type{Int32} , x:: Float128 ) =
262
- @ccall (quadoplib. __fixtfsi (x:: Cfloat128 ):: Int32 )
254
+ @quad_ccall (quadoplib. __fixtfsi (x:: Cfloat128 ):: Int32 )
263
255
264
256
@assume_effects :foldable unsafe_trunc (:: Type{Int64} , x:: Float128 ) =
265
- @ccall (quadoplib. __fixtfdi (x:: Cfloat128 ):: Int64 )
257
+ @quad_ccall (quadoplib. __fixtfdi (x:: Cfloat128 ):: Int64 )
266
258
267
259
@assume_effects :foldable unsafe_trunc (:: Type{UInt32} , x:: Float128 ) =
268
- @ccall (quadoplib. __fixunstfsi (x:: Cfloat128 ):: UInt32 )
260
+ @quad_ccall (quadoplib. __fixunstfsi (x:: Cfloat128 ):: UInt32 )
269
261
270
262
@assume_effects :foldable unsafe_trunc (:: Type{UInt64} , x:: Float128 ) =
271
- @ccall (quadoplib. __fixunstfdi (x:: Cfloat128 ):: UInt64 )
263
+ @quad_ccall (quadoplib. __fixunstfdi (x:: Cfloat128 ):: UInt64 )
272
264
273
265
function unsafe_trunc (:: Type{UInt128} , x:: Float128 )
274
266
xu = reinterpret (UInt128,x)
@@ -340,19 +332,19 @@ for f in (:acos, :acosh, :asin, :asinh, :atan, :atanh, :cosh, :cos,
340
332
:sin , :sinh , :sqrt , :tan , :tanh ,
341
333
:ceil , :floor , :trunc , )
342
334
@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 ))
344
336
end
345
337
end
346
338
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 ))
349
341
round (x:: Float128 , r:: RoundingMode{:Down} ) = floor (x)
350
342
round (x:: Float128 , r:: RoundingMode{:Up} ) = ceil (x)
351
343
round (x:: Float128 , r:: RoundingMode{:ToZero} ) = round (x)
352
344
353
345
# # two argument
354
346
@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 ))
356
348
357
349
# circumvent a failure in Base
358
350
function (^ )(x:: Float128 , p:: Integer )
@@ -363,15 +355,15 @@ function (^)(x::Float128, p::Integer)
363
355
end
364
356
end
365
357
@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 ))
367
359
@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 ))
369
361
@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 ))
371
363
372
364
Base. Integer (x:: Float128 ) = Int (x)
373
365
@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 ))
375
367
376
368
sincos (x:: Float128 ) = (sin (x), cos (x))
377
369
@@ -380,12 +372,12 @@ sincos(x::Float128) = (sin(x), cos(x))
380
372
# disable fma on Windows until rounding mode issue fixed
381
373
# https://github.com/JuliaMath/Quadmath.jl/issues/31
382
374
@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 ))
384
376
end
385
377
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 )
389
381
390
382
isinteger (x:: Float128 ) = isfinite (x) && x === trunc (x)
391
383
@@ -410,14 +402,14 @@ typemax(::Type{Float128}) = Inf128
410
402
typemin (:: Type{Float128} ) = - Inf128
411
403
412
404
@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 ))
414
406
ldexp (x:: Float128 , n:: Integer ) =
415
407
ldexp (x, clamp (n, typemin (Cint), typemax (Cint)) % Cint)
416
408
417
409
418
410
@assume_effects :foldable function frexp (x:: Float128 )
419
411
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 ))
421
413
return f, Int (ri[])
422
414
end
423
415
@@ -621,13 +613,13 @@ end
621
613
622
614
# TODO : need to do this better
623
615
function 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 ))
625
617
end
626
618
627
619
function string (x:: Float128 )
628
620
lng = 64
629
621
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 )
631
623
return String (resize! (buf, lng))
632
624
end
633
625
@@ -636,4 +628,7 @@ show(io::IO, b::Float128) = print(io, string(b))
636
628
637
629
include (" printf.jl" )
638
630
631
+ if ! isdefined (Base, :get_extension )
632
+ include (" ../ext/QuadmathSpecialFunctionsExt.jl" )
633
+ end
639
634
end # module Quadmath
0 commit comments