Skip to content

Commit f6ea87e

Browse files
authored
Merge pull request #88 from JuliaMath/os/weakdep
Switch Requires.jl to weakdep
2 parents 3c9f0ae + d3801f9 commit f6ea87e

File tree

5 files changed

+86
-80
lines changed

5 files changed

+86
-80
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Manifest.toml

Project.toml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
name = "Quadmath"
22
uuid = "be4d8f0f-7fa4-5f49-b795-2f01399ab2dd"
3-
version = "0.5.13"
3+
version = "0.5.14"
44

55
[deps]
66
Compat = "34da2185-b29b-5c13-b0c7-acf172513d20"
77
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
88
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
9-
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
9+
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
10+
11+
[weakdeps]
12+
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
13+
14+
[extensions]
15+
QuadmathSpecialFunctionsExt = ["SpecialFunctions"]
1016

1117
[compat]
1218
Aqua = "0.6"
1319
Compat = "4.4"
1420
Printf = "<0.0.1, 1"
1521
Random = "<0.0.1, 1"
16-
Requires = "1.0"
1722
SpecialFunctions = "2.0"
1823
Test = "<0.0.1, 1"
1924
julia = "1.6"

ext/QuadmathSpecialFunctionsExt.jl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
module QuadmathSpecialFunctionsExt
2+
3+
using Quadmath: libquadmath, Float128, Cfloat128, @quad_ccall
4+
import SpecialFunctions
5+
import SpecialFunctions: erf, erfc, besselj0, besselj1, bessely0, bessely1,
6+
besselj, bessely, gamma, logabsgamma
7+
8+
erf(x::Float128) =
9+
Float128(@quad_ccall(libquadmath.erfq(x::Cfloat128)::Cfloat128))
10+
erfc(x::Float128) =
11+
Float128(@quad_ccall(libquadmath.erfcq(x::Cfloat128)::Cfloat128))
12+
13+
besselj0(x::Float128) =
14+
Float128(@quad_ccall(libquadmath.j0q(x::Cfloat128)::Cfloat128))
15+
besselj1(x::Float128) =
16+
Float128(@quad_ccall(libquadmath.j1q(x::Cfloat128)::Cfloat128))
17+
18+
bessely0(x::Float128) =
19+
Float128(@quad_ccall(libquadmath.y0q(x::Cfloat128)::Cfloat128))
20+
bessely1(x::Float128) =
21+
Float128(@quad_ccall(libquadmath.y1q(x::Cfloat128)::Cfloat128))
22+
23+
besselj(n::Integer, x::Float128) =
24+
Float128(@quad_ccall(libquadmath.jnq(n::Cint, x::Cfloat128)::Cfloat128))
25+
bessely(n::Integer, x::Float128) =
26+
Float128(@quad_ccall(libquadmath.ynq(n::Cint, x::Cfloat128)::Cfloat128))
27+
28+
gamma(x::Float128) =
29+
Float128(@quad_ccall(libquadmath.tgammaq(x::Cfloat128)::Cfloat128))
30+
31+
function logabsgamma(x::Float128)
32+
result = Float128(@quad_ccall(libquadmath.lgammaq(x::Cfloat128)::Cfloat128))
33+
sign = !isfinite(result) || x >= 0 || !iszero(mod(ceil(x), 2)) ? 1 : -1
34+
return result, sign
35+
end
36+
37+
end

src/Quadmath.jl

Lines changed: 40 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
module Quadmath
2-
using Requires
32
using Compat: @assume_effects
43

54
export Float128, ComplexF128, Inf128
@@ -42,7 +41,7 @@ elseif Sys.iswindows()
4241
const libquadmath = "libquadmath-0.dll"
4342
end
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) =
116115
reinterpret(::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-
126118
sign_mask(::Type{Float128}) = 0x8000_0000_0000_0000_0000_0000_0000_0000
127119
exponent_mask(::Type{Float128}) = 0x7fff_0000_0000_0000_0000_0000_0000_0000
128120
exponent_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
161153
Float128(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

181173
Float128(x::Int16) = Float128(Int32(x))
182174
Float128(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

273265
function 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
345337
end
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))
349341
round(x::Float128, r::RoundingMode{:Down}) = floor(x)
350342
round(x::Float128, r::RoundingMode{:Up}) = ceil(x)
351343
round(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
358350
function (^)(x::Float128, p::Integer)
@@ -363,15 +355,15 @@ function (^)(x::Float128, p::Integer)
363355
end
364356
end
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

372364
Base.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

376368
sincos(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))
384376
end
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

390382
isinteger(x::Float128) = isfinite(x) && x === trunc(x)
391383

@@ -410,14 +402,14 @@ typemax(::Type{Float128}) = Inf128
410402
typemin(::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))
414406
ldexp(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[])
422414
end
423415

@@ -621,13 +613,13 @@ end
621613

622614
# TODO: need to do this better
623615
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))
625617
end
626618

627619
function 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))
632624
end
633625

@@ -636,4 +628,7 @@ show(io::IO, b::Float128) = print(io, string(b))
636628

637629
include("printf.jl")
638630

631+
if !isdefined(Base, :get_extension)
632+
include("../ext/QuadmathSpecialFunctionsExt.jl")
633+
end
639634
end # module Quadmath

src/specfun.jl

Lines changed: 0 additions & 32 deletions
This file was deleted.

0 commit comments

Comments
 (0)