1
1
module Quadmath
2
2
using Requires
3
+ using Compat: @assume_effects
3
4
4
5
export Float128, ComplexF128, Inf128
5
6
@@ -128,32 +129,32 @@ fpinttype(::Type{Float128}) = UInt128
128
129
Float128 (x:: Float128 ) = x
129
130
130
131
# Float64
131
- Float128 (x:: Float64 ) =
132
+ @assume_effects :foldable Float128 (x:: Float64 ) =
132
133
Float128 (@ccall (quadoplib. __extenddftf2 (x:: Cdouble ):: Cfloat128 ))
133
- Float64 (x:: Float128 ) =
134
+ @assume_effects :foldable Float64 (x:: Float128 ) =
134
135
@ccall (quadoplib. __trunctfdf2 (x:: Cfloat128 ):: Cdouble )
135
136
136
137
# Float32
137
- Float128 (x:: Float32 ) =
138
+ @assume_effects :foldable Float128 (x:: Float32 ) =
138
139
Float128 (@ccall (quadoplib. __extendsftf2 (x:: Cfloat ):: Cfloat128 ))
139
- Float32 (x:: Float128 ) =
140
+ @assume_effects :foldable Float32 (x:: Float128 ) =
140
141
@ccall (quadoplib. __trunctfsf2 (x:: Cfloat128 ):: Cfloat )
141
142
142
143
# Float16
143
144
Float128 (x:: Float16 ) = Float128 (Float32 (x))
144
- Float16 (x:: Float128 ) = Float16 (Float32 (x)) # TODO : avoid double rounding
145
+ Float16 (x:: Float128 ) = Float16 (Float64 (x)) # TODO : avoid double rounding
145
146
146
147
# integer -> Float128
147
- Float128 (x:: Int32 ) =
148
+ @assume_effects :foldable Float128 (x:: Int32 ) =
148
149
Float128 (@ccall (quadoplib. __floatsitf (x:: Int32 ):: Cfloat128 ))
149
150
150
- Float128 (x:: UInt32 ) =
151
+ @assume_effects :foldable Float128 (x:: UInt32 ) =
151
152
Float128 (@ccall (quadoplib. __floatunsitf (x:: UInt32 ):: Cfloat128 ))
152
153
153
- Float128 (x:: Int64 ) =
154
+ @assume_effects :foldable Float128 (x:: Int64 ) =
154
155
Float128 (@ccall (quadoplib. __floatditf (x:: Int64 ):: Cfloat128 ))
155
156
156
- Float128 (x:: UInt64 ) =
157
+ @assume_effects :foldable Float128 (x:: UInt64 ) =
157
158
Float128 (@ccall (quadoplib. __floatunditf (x:: UInt64 ):: Cfloat128 ))
158
159
159
160
Float128 (x:: Int16 ) = Float128 (Int32 (x))
@@ -215,37 +216,37 @@ Float128(x::Rational{T}) where T = Float128(numerator(x))/Float128(denominator(x
215
216
Float128 (x:: Bool ) = x ? Float128 (1 ) : Float128 (0 )
216
217
217
218
# Comparison
218
- (== )(x:: Float128 , y:: Float128 ) =
219
+ @assume_effects :foldable (== )(x:: Float128 , y:: Float128 ) =
219
220
@ccall (quadoplib. __eqtf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) == 0
220
- (< )(x:: Float128 , y:: Float128 ) =
221
+ @assume_effects :foldable (< )(x:: Float128 , y:: Float128 ) =
221
222
@ccall (quadoplib. __letf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) == - 1
222
- (<= )(x:: Float128 , y:: Float128 ) =
223
+ @assume_effects :foldable (<= )(x:: Float128 , y:: Float128 ) =
223
224
@ccall (quadoplib. __letf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) <= 0
224
225
225
226
# Arithmetic
226
- (+ )(x:: Float128 , y:: Float128 ) =
227
+ @assume_effects :foldable (+ )(x:: Float128 , y:: Float128 ) =
227
228
Float128 (@ccall (quadoplib. __addtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
228
- (- )(x:: Float128 , y:: Float128 ) =
229
+ @assume_effects :foldable (- )(x:: Float128 , y:: Float128 ) =
229
230
Float128 (@ccall (quadoplib. __subtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
230
- (* )(x:: Float128 , y:: Float128 ) =
231
+ @assume_effects :foldable (* )(x:: Float128 , y:: Float128 ) =
231
232
Float128 (@ccall (quadoplib. __multf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
232
- (/ )(x:: Float128 , y:: Float128 ) =
233
+ @assume_effects :foldable (/ )(x:: Float128 , y:: Float128 ) =
233
234
Float128 (@ccall (quadoplib. __divtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
234
235
235
- (- )(x:: Float128 ) =
236
+ @assume_effects :foldable (- )(x:: Float128 ) =
236
237
Float128 (@ccall (quadoplib. __negtf2 (x:: Cfloat128 ):: Cfloat128 ))
237
238
238
239
# Float128 -> Integer
239
- unsafe_trunc (:: Type{Int32} , x:: Float128 ) =
240
+ @assume_effects :foldable unsafe_trunc (:: Type{Int32} , x:: Float128 ) =
240
241
@ccall (quadoplib. __fixtfsi (x:: Cfloat128 ):: Int32 )
241
242
242
- unsafe_trunc (:: Type{Int64} , x:: Float128 ) =
243
+ @assume_effects :foldable unsafe_trunc (:: Type{Int64} , x:: Float128 ) =
243
244
@ccall (quadoplib. __fixtfdi (x:: Cfloat128 ):: Int64 )
244
245
245
- unsafe_trunc (:: Type{UInt32} , x:: Float128 ) =
246
+ @assume_effects :foldable unsafe_trunc (:: Type{UInt32} , x:: Float128 ) =
246
247
@ccall (quadoplib. __fixunstfsi (x:: Cfloat128 ):: UInt32 )
247
248
248
- unsafe_trunc (:: Type{UInt64} , x:: Float128 ) =
249
+ @assume_effects :foldable unsafe_trunc (:: Type{UInt64} , x:: Float128 ) =
249
250
@ccall (quadoplib. __fixunstfdi (x:: Cfloat128 ):: UInt64 )
250
251
251
252
function unsafe_trunc (:: Type{UInt128} , x:: Float128 )
@@ -317,19 +318,19 @@ for f in (:acos, :acosh, :asin, :asinh, :atan, :atanh, :cosh, :cos,
317
318
:exp , :expm1 , :log , :log2 , :log10 , :log1p ,
318
319
:sin , :sinh , :sqrt , :tan , :tanh ,
319
320
:ceil , :floor , :trunc , )
320
- @eval function $f (x:: Float128 )
321
+ @eval @assume_effects :foldable function $f (x:: Float128 )
321
322
Float128 (@ccall (libquadmath.$ (string (f,:q ))(x:: Cfloat128 ):: Cfloat128 ))
322
323
end
323
324
end
324
325
325
- abs (x:: Float128 ) = Float128 (@ccall (libquadmath. fabsq (x:: Cfloat128 ):: Cfloat128 ))
326
- round (x:: Float128 ) = Float128 (@ccall (libquadmath. rintq (x:: Cfloat128 ):: Cfloat128 ))
326
+ @assume_effects :foldable abs (x:: Float128 ) = Float128 (@ccall (libquadmath. fabsq (x:: Cfloat128 ):: Cfloat128 ))
327
+ @assume_effects :foldable round (x:: Float128 ) = Float128 (@ccall (libquadmath. rintq (x:: Cfloat128 ):: Cfloat128 ))
327
328
round (x:: Float128 , r:: RoundingMode{:Down} ) = floor (x)
328
329
round (x:: Float128 , r:: RoundingMode{:Up} ) = ceil (x)
329
330
round (x:: Float128 , r:: RoundingMode{:ToZero} ) = round (x)
330
331
331
332
# # two argument
332
- (^ )(x:: Float128 , y:: Float128 ) =
333
+ @assume_effects :foldable (^ )(x:: Float128 , y:: Float128 ) =
333
334
Float128 (@ccall (libquadmath. powq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
334
335
335
336
# circumvent a failure in Base
@@ -340,25 +341,25 @@ function (^)(x::Float128, p::Integer)
340
341
Base. power_by_squaring (inv (x),- p)
341
342
end
342
343
end
343
- copysign (x:: Float128 , y:: Float128 ) =
344
+ @assume_effects :foldable copysign (x:: Float128 , y:: Float128 ) =
344
345
Float128 (@ccall (libquadmath. copysignq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
345
- hypot (x:: Float128 , y:: Float128 ) =
346
+ @assume_effects :foldable hypot (x:: Float128 , y:: Float128 ) =
346
347
Float128 (@ccall (libquadmath. hypotq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
347
- atan (x:: Float128 , y:: Float128 ) =
348
+ @assume_effects :foldable atan (x:: Float128 , y:: Float128 ) =
348
349
Float128 (@ccall (libquadmath. atan2q (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
349
350
sincos (x:: Float128 ) = (sin (x), cos (x))
350
351
351
352
# # misc
352
353
@static if ! Sys. iswindows ()
353
354
# disable fma on Windows until rounding mode issue fixed
354
355
# https://github.com/JuliaMath/Quadmath.jl/issues/31
355
- fma (x:: Float128 , y:: Float128 , z:: Float128 ) =
356
+ @assume_effects :foldable fma (x:: Float128 , y:: Float128 , z:: Float128 ) =
356
357
Float128 (@ccall (libquadmath. fmaq (x:: Cfloat128 , y:: Cfloat128 , z:: Cfloat128 ):: Cfloat128 ))
357
358
end
358
359
359
- isnan (x:: Float128 ) = 0 != @ccall (libquadmath. isnanq (x:: Cfloat128 ):: Cint )
360
- isinf (x:: Float128 ) = 0 != @ccall (libquadmath. isinfq (x:: Cfloat128 ):: Cint )
361
- isfinite (x:: Float128 ) = 0 != @ccall (libquadmath. finiteq (x:: Cfloat128 ):: Cint )
360
+ @assume_effects :foldable isnan (x:: Float128 ) = 0 != @ccall (libquadmath. isnanq (x:: Cfloat128 ):: Cint )
361
+ @assume_effects :foldable isinf (x:: Float128 ) = 0 != @ccall (libquadmath. isinfq (x:: Cfloat128 ):: Cint )
362
+ @assume_effects :foldable isfinite (x:: Float128 ) = 0 != @ccall (libquadmath. finiteq (x:: Cfloat128 ):: Cint )
362
363
363
364
isinteger (x:: Float128 ) = isfinite (x) && x === trunc (x)
364
365
@@ -382,13 +383,13 @@ const Inf128 = reinterpret(Float128, 0x7fff_0000_0000_0000_0000_0000_0000_0000)
382
383
typemax (:: Type{Float128} ) = Inf128
383
384
typemin (:: Type{Float128} ) = - Inf128
384
385
385
- ldexp (x:: Float128 , n:: Cint ) =
386
+ @assume_effects :foldable ldexp (x:: Float128 , n:: Cint ) =
386
387
Float128 (@ccall (libquadmath. ldexpq (x:: Cfloat128 , n:: Cint ):: Cfloat128 ))
387
388
ldexp (x:: Float128 , n:: Integer ) =
388
389
ldexp (x, clamp (n, typemin (Cint), typemax (Cint)) % Cint)
389
390
390
391
391
- function frexp (x:: Float128 )
392
+ @assume_effects :foldable function frexp (x:: Float128 )
392
393
ri = Ref {Cint} ()
393
394
f = Float128 (@ccall (libquadmath. frexpq (x:: Cfloat128 , ri:: Ptr{Cint} ):: Cfloat128 ))
394
395
return f, Int (ri[])
0 commit comments