1
- module float128
1
+ module Quadmath
2
2
3
- export Complex256
3
+ export Float128, Complex256
4
4
5
5
import
6
6
Base: + , - , (* ), / , < , <= , == , > , >= , ^ , convert, promote_rule,
@@ -18,22 +18,23 @@ import
18
18
19
19
import Base. GMP: ClongMax, CulongMax, CdoubleMax
20
20
21
- # bitstype 128 Float128 <: AbstractFloat # this is in base/boot.jl
21
+ bitstype 128 Float128 <: AbstractFloat # this is in base/boot.jl
22
22
# Note: with "<: AbstracFloat" multiplication of two Float128 numbers
23
23
# mysteriously doesn't work!
24
24
25
25
typealias Complex256 Complex{Float128}
26
26
27
-
27
+ const libquadmath_wrapper = joinpath (dirname (@__FILE__ ),
28
+ " .." , " deps" , " usr" , " lib" , " libquadmath_wrapper.so" )
28
29
29
30
convert (:: Type{Float128} , x:: Float128 ) = x
30
31
31
32
convert (:: Type{Float128} , x:: Clong ) =
32
- ccall ((:convert_qsi , :libfloat128 ), Float128, ( Clong, ), x )
33
+ ccall ((:convert_qsi , libquadmath_wrapper ), Float128, ( Clong, ), x )
33
34
convert (:: Type{Float128} , x:: Culong ) =
34
- ccall ((:convert_qui , :libfloat128 ), Float128, ( Culong, ), x )
35
+ ccall ((:convert_qui , libquadmath_wrapper ), Float128, ( Culong, ), x )
35
36
convert (:: Type{Float128} , x:: Float64 ) =
36
- ccall ((:convert_qd , :libfloat128 ), Float128, ( Float64, ), x )
37
+ ccall ((:convert_qd , libquadmath_wrapper ), Float128, ( Float64, ), x )
37
38
38
39
# convert(::Type{Float128}, x::Integer) = Float128(BigInt(x))
39
40
@@ -45,14 +46,14 @@ convert(::Type{Float128}, x::Rational) = Float128(num(x)) / Float128(den(x))
45
46
46
47
# # Float128 -> AbstractFloat
47
48
convert (:: Type{Float64} , x:: Float128 ) =
48
- ccall ((:convert_dq ,:libfloat128 ), Float64, (Float128,), x)
49
+ ccall ((:convert_dq ,libquadmath_wrapper ), Float64, (Float128,), x)
49
50
convert (:: Type{Float32} , x:: Float128 ) =
50
- ccall ((:convert_fq ,:libfloat128 ), Float32, (Float128,), x)
51
+ ccall ((:convert_fq ,libquadmath_wrapper ), Float32, (Float128,), x)
51
52
52
53
call (:: Type{Float64} , x:: Float128 , r:: RoundingMode ) =
53
- ccall ((:convert_dq ,:libfloat128 ), Float64, (Float128,), x)
54
+ ccall ((:convert_dq ,libquadmath_wrapper ), Float64, (Float128,), x)
54
55
call (:: Type{Float32} , x:: Float128 , r:: RoundingMode ) =
55
- ccall ((:convert_fq ,:libfloat128 ), Float32, (Float128,), x)
56
+ ccall ((:convert_fq ,libquadmath_wrapper ), Float32, (Float128,), x)
56
57
# TODO : avoid double rounding
57
58
call (:: Type{Float16} , x:: Float128 , r:: RoundingMode ) =
58
59
convert (Float16, call (Float32, x, r))
@@ -63,42 +64,42 @@ promote_rule{T<:AbstractFloat}(::Type{Float128},::Type{T}) = Float128
63
64
64
65
65
66
function tryparse (:: Type{Float128} , s:: AbstractString , base:: Int = 0 )
66
- Nullable (ccall ((:set_str_q , :libfloat128 ), Float128, (Cstring, ), s))
67
+ Nullable (ccall ((:set_str_q , libquadmath_wrapper ), Float128, (Cstring, ), s))
67
68
end
68
69
69
70
# Basic arithmetic without promotion
70
71
for (fJ, fC) in ((:+ ,:add ), (:- ,:sub ), (:/ ,:div ), (:(* ),:mul ))
71
72
@eval begin
72
73
# Float128
73
74
function ($ fJ)(x:: Float128 , y:: Float128 )
74
- ccall (($ (string (fC,:_q )),:libfloat128 ), Float128, (Float128, Float128), x, y)
75
+ ccall (($ (string (fC,:_q )),libquadmath_wrapper ), Float128, (Float128, Float128), x, y)
75
76
end
76
77
77
78
# Unsigned Integer
78
79
function ($ fJ)(x:: Float128 , y:: CulongMax )
79
- ccall (($ (string (fC,:_qui )),:libfloat128 ), Float128, (Float128, Culong), x, y)
80
+ ccall (($ (string (fC,:_qui )),libquadmath_wrapper ), Float128, (Float128, Culong), x, y)
80
81
end
81
82
82
83
function ($ fJ)(x:: CulongMax , y:: Float128 )
83
- ccall (($ (string (fC,:_uiq )),:libfloat128 ), Float128, (Culong, Float128), x, y)
84
+ ccall (($ (string (fC,:_uiq )),libquadmath_wrapper ), Float128, (Culong, Float128), x, y)
84
85
end
85
86
86
87
# Signed Integer
87
88
function ($ fJ)(x:: Float128 , y:: ClongMax )
88
- ccall (($ (string (fC,:_qsi )),:libfloat128 ), Float128, (Float128, Clong), x, y)
89
+ ccall (($ (string (fC,:_qsi )),libquadmath_wrapper ), Float128, (Float128, Clong), x, y)
89
90
end
90
91
91
92
function ($ fJ)(x:: ClongMax , y:: Float128 )
92
- ccall (($ (string (fC,:_siq )),:libfloat128 ), Float128, (Clong, Float128), x, y)
93
+ ccall (($ (string (fC,:_siq )),libquadmath_wrapper ), Float128, (Clong, Float128), x, y)
93
94
end
94
95
95
96
# Float32, Float64
96
97
function ($ fJ)(x:: Float128 , y:: CdoubleMax )
97
- ccall (($ (string (fC,:_qd )),:libfloat128 ), Float128, (Float128, Cdouble), x, y)
98
+ ccall (($ (string (fC,:_qd )),libquadmath_wrapper ), Float128, (Float128, Cdouble), x, y)
98
99
end
99
100
100
101
function ($ fJ)(x:: CdoubleMax , y:: Float128 ,)
101
- ccall (($ (string (fC,:_dq )),:libfloat128 ), Float128, (Cdouble, Float128), x, y)
102
+ ccall (($ (string (fC,:_dq )),libquadmath_wrapper ), Float128, (Cdouble, Float128), x, y)
102
103
end
103
104
end
104
105
end
@@ -108,43 +109,43 @@ for (fJ, fC) in ((:+,:cadd), (:-,:csub), (:/,:cdiv), (:(*),:cmul))
108
109
@eval begin
109
110
# Float128
110
111
function ($ fJ)(x:: Complex256 , y:: Complex256 )
111
- ccall (($ (string (fC,:_q )),:libfloat128 ), Complex256, (Complex256, Complex256), x, y)
112
+ ccall (($ (string (fC,:_q )),libquadmath_wrapper ), Complex256, (Complex256, Complex256), x, y)
112
113
end
113
114
114
115
# Unsigned Integer
115
116
function ($ fJ)(x:: Complex256 , y:: CulongMax )
116
- ccall (($ (string (fC,:_qui )),:libfloat128 ), Complex256, (Complex256, Culong), x, y)
117
+ ccall (($ (string (fC,:_qui )),libquadmath_wrapper ), Complex256, (Complex256, Culong), x, y)
117
118
end
118
119
119
120
function ($ fJ)(x:: CulongMax , y:: Complex256 )
120
- ccall (($ (string (fC,:_uiq )),:libfloat128 ), Complex256, (Culong, Complex256), x, y)
121
+ ccall (($ (string (fC,:_uiq )),libquadmath_wrapper ), Complex256, (Culong, Complex256), x, y)
121
122
end
122
123
123
124
# Signed Integer
124
125
function ($ fJ)(x:: Complex256 , y:: ClongMax )
125
- ccall (($ (string (fC,:_qsi )),:libfloat128 ), Complex256, (Complex256, Clong), x, y)
126
+ ccall (($ (string (fC,:_qsi )),libquadmath_wrapper ), Complex256, (Complex256, Clong), x, y)
126
127
end
127
128
128
129
function ($ fJ)(x:: ClongMax , y:: Complex256 )
129
- ccall (($ (string (fC,:_siq )),:libfloat128 ), Complex256, (Clong, Complex256), x, y)
130
+ ccall (($ (string (fC,:_siq )),libquadmath_wrapper ), Complex256, (Clong, Complex256), x, y)
130
131
end
131
132
132
133
# Float32, Float64
133
134
function ($ fJ)(x:: Complex256 , y:: CdoubleMax )
134
- ccall (($ (string (fC,:_qd )),:libfloat128 ), Complex256, (Complex256, Cdouble), x, y)
135
+ ccall (($ (string (fC,:_qd )),libquadmath_wrapper ), Complex256, (Complex256, Cdouble), x, y)
135
136
end
136
137
137
138
function ($ fJ)(x:: CdoubleMax , y:: Complex256 ,)
138
- ccall (($ (string (fC,:_dq )),:libfloat128 ), Complex256, (Cdouble, Complex256), x, y)
139
+ ccall (($ (string (fC,:_dq )),libquadmath_wrapper ), Complex256, (Cdouble, Complex256), x, y)
139
140
end
140
141
141
142
# Float128
142
143
function ($ fJ)(x:: Complex256 , y:: Float128 )
143
- ccall (($ (string (fC,:_qD )),:libfloat128 ), Complex256, (Complex256, Float128), x, y)
144
+ ccall (($ (string (fC,:_qD )),libquadmath_wrapper ), Complex256, (Complex256, Float128), x, y)
144
145
end
145
146
146
147
function ($ fJ)(x:: Float128 , y:: Complex256 ,)
147
- ccall (($ (string (fC,:_Dq )),:libfloat128 ), Complex256, (Float128, Complex256), x, y)
148
+ ccall (($ (string (fC,:_Dq )),libquadmath_wrapper ), Complex256, (Float128, Complex256), x, y)
148
149
end
149
150
150
151
end
@@ -158,58 +159,58 @@ for (fJ, fC) in ((:<,:less), (:<=,:less_equal), (:(==),:equal), (:>=,:greater_eq
158
159
@eval begin
159
160
# Float128
160
161
function ($ fJ)(x:: Float128 , y:: Float128 )
161
- ccall (($ (string (fC,:_q )),:libfloat128 ), Cint, (Float128, Float128), x, y) != 0
162
+ ccall (($ (string (fC,:_q )),libquadmath_wrapper ), Cint, (Float128, Float128), x, y) != 0
162
163
end
163
164
164
165
# Unsigned Integer
165
166
function ($ fJ)(x:: Float128 , y:: CulongMax )
166
- ccall (($ (string (fC,:_qui )),:libfloat128 ), Cint, (Float128, Culong), x, y) != 0
167
+ ccall (($ (string (fC,:_qui )),libquadmath_wrapper ), Cint, (Float128, Culong), x, y) != 0
167
168
end
168
169
169
170
function ($ fJ)(x:: CulongMax , y:: Float128 )
170
- ccall (($ (string (fC,:_uiq )),:libfloat128 ), Cint, (Culong, Float128), x, y) != 0
171
+ ccall (($ (string (fC,:_uiq )),libquadmath_wrapper ), Cint, (Culong, Float128), x, y) != 0
171
172
end
172
173
173
174
# Signed Integer
174
175
function ($ fJ)(x:: Float128 , y:: ClongMax )
175
- ccall (($ (string (fC,:_qsi )),:libfloat128 ), Cint, (Float128, Clong), x, y) != 0
176
+ ccall (($ (string (fC,:_qsi )),libquadmath_wrapper ), Cint, (Float128, Clong), x, y) != 0
176
177
end
177
178
178
179
function ($ fJ)(x:: ClongMax , y:: Float128 )
179
- ccall (($ (string (fC,:_siq )),:libfloat128 ), Cint, (Clong, Float128), x, y) != 0
180
+ ccall (($ (string (fC,:_siq )),libquadmath_wrapper ), Cint, (Clong, Float128), x, y) != 0
180
181
end
181
182
182
183
# Float32, Float64
183
184
function ($ fJ)(x:: Float128 , y:: CdoubleMax )
184
- ccall (($ (string (fC,:_qd )),:libfloat128 ), Cint, (Float128, Cdouble), x, y) != 0
185
+ ccall (($ (string (fC,:_qd )),libquadmath_wrapper ), Cint, (Float128, Cdouble), x, y) != 0
185
186
end
186
187
187
188
function ($ fJ)(x:: CdoubleMax , y:: Float128 ,)
188
- ccall (($ (string (fC,:_dq )),:libfloat128 ), Cint, (Cdouble, Float128), x, y) != 0
189
+ ccall (($ (string (fC,:_dq )),libquadmath_wrapper ), Cint, (Cdouble, Float128), x, y) != 0
189
190
end
190
191
end
191
192
end
192
193
193
194
194
195
function fma (x:: Float128 , y:: Float128 , z:: Float128 )
195
- ccall ((" fma_q" ,:libfloat128 ), Float128, (Float128, Float128, Float128, ), x, y, z)
196
+ ccall ((" fma_q" ,libquadmath_wrapper ), Float128, (Float128, Float128, Float128, ), x, y, z)
196
197
end
197
198
198
199
199
200
function - (x:: Float128 )
200
- ccall ((:neg_q , :libfloat128 ), Float128, (Float128,), x)
201
+ ccall ((:neg_q , libquadmath_wrapper ), Float128, (Float128,), x)
201
202
end
202
203
203
204
function ^ (x:: Float128 , y:: Float128 )
204
- ccall ((:pow_q , :libfloat128 ), Float128, (Float128, Float128,), x, y)
205
+ ccall ((:pow_q , libquadmath_wrapper ), Float128, (Float128, Float128,), x, y)
205
206
end
206
207
207
208
# constants
208
- eps (:: Type{Float128} ) = ccall ((" eps_q" , :libfloat128 ), Float128, (), )
209
- realmin (:: Type{Float128} ) = ccall ((" realmin_q" , :libfloat128 ), Float128, (), )
210
- realmax (:: Type{Float128} ) = ccall ((" realmax_q" , :libfloat128 ), Float128, (), )
211
- convert (:: Type{Float128} , :: Irrational{:π} ) = ccall ((" pi_q" , :libfloat128 ), Float128, (), )
212
- convert (:: Type{Float128} , :: Irrational{:e} ) = ccall ((" e_q" , :libfloat128 ), Float128, (), )
209
+ eps (:: Type{Float128} ) = ccall ((" eps_q" , libquadmath_wrapper ), Float128, (), )
210
+ realmin (:: Type{Float128} ) = ccall ((" realmin_q" , libquadmath_wrapper ), Float128, (), )
211
+ realmax (:: Type{Float128} ) = ccall ((" realmax_q" , libquadmath_wrapper ), Float128, (), )
212
+ convert (:: Type{Float128} , :: Irrational{:π} ) = ccall ((" pi_q" , libquadmath_wrapper ), Float128, (), )
213
+ convert (:: Type{Float128} , :: Irrational{:e} ) = ccall ((" e_q" , libquadmath_wrapper ), Float128, (), )
213
214
214
215
215
216
@@ -219,56 +220,56 @@ for f in (:acos, :acosh, :asin, :asinh, :atan, :atanh, :cosh, :cos,
219
220
:tan , :tanh , :besselj0 , :besselj1 , :bessely0 , :bessely1 , :abs ,
220
221
:ceil , :floor , :trunc , :round , :gamma , :lgamma , )
221
222
@eval function $f (x:: Float128 )
222
- ccall (($ (string (f,:_q )), :libfloat128 ), Float128, (Float128, ), x)
223
+ ccall (($ (string (f,:_q )), libquadmath_wrapper ), Float128, (Float128, ), x)
223
224
end
224
225
end
225
226
226
227
for f in (:atan2 , :copysign , :max , :min , :hypot ,)
227
228
@eval function $f (x:: Float128 , y:: Float128 )
228
- ccall (($ (string (f,:_q )), :libfloat128 ), Float128, (Float128, Float128), x, y)
229
+ ccall (($ (string (f,:_q )), libquadmath_wrapper ), Float128, (Float128, Float128), x, y)
229
230
end
230
231
end
231
232
232
233
for f in (:besselj , :bessely ,)
233
234
@eval function $f (n:: Integer , x:: Float128 )
234
- ccall (($ (string (f,:_q )), :libfloat128 ), Float128, (Cint, Float128), n, x)
235
+ ccall (($ (string (f,:_q )), libquadmath_wrapper ), Float128, (Cint, Float128), n, x)
235
236
end
236
237
end
237
238
238
239
function - (x:: Complex256 )
239
- ccall ((:cneg_q , :libfloat128 ), Complex256, (Complex256,), x)
240
+ ccall ((:cneg_q , libquadmath_wrapper ), Complex256, (Complex256,), x)
240
241
end
241
242
242
243
function ^ (x:: Complex256 , y:: Complex256 )
243
- ccall ((:cpow_q , :libfloat128 ), Complex256, (Complex256, Complex256,), x, y)
244
+ ccall ((:cpow_q , libquadmath_wrapper ), Complex256, (Complex256, Complex256,), x, y)
244
245
end
245
246
246
247
# unary complex functions
247
248
for f in (:acos , :acosh , :asin , :asinh , :atan , :atanh , :cosh , :cos ,
248
249
:exp , :log , :log10 , :conj , :sin , :sinh , :sqrt ,
249
250
:tan , :tanh , )
250
251
@eval function $f (x:: Complex256 )
251
- ccall (($ (string (:c ,f,:_q )), :libfloat128 ), Complex256, (Complex256, ), x)
252
+ ccall (($ (string (:c ,f,:_q )), libquadmath_wrapper ), Complex256, (Complex256, ), x)
252
253
end
253
254
end
254
255
255
256
# unary complex functions with real result
256
257
for f in (:abs , :imag , :real , :angle )
257
258
@eval function $f (x:: Float128 )
258
- ccall (($ (string (:c ,f,:_q )), :libfloat128 ), Float128, (Complex256, ), x)
259
+ ccall (($ (string (:c ,f,:_q )), libquadmath_wrapper ), Float128, (Complex256, ), x)
259
260
end
260
261
end
261
262
262
263
function cis (x:: Float128 )
263
- ccall ((:ccis_q , :libfloat128 ), Complex256, (Float128,), x)
264
+ ccall ((:ccis_q , libquadmath_wrapper ), Complex256, (Float128,), x)
264
265
end
265
266
266
267
267
268
268
269
function string (x:: Float128 )
269
270
lng = 64
270
271
buf = Array (UInt8, lng + 1 )
271
- lng = ccall ((:stringq ,:libfloat128 ), Int32, (Ptr{UInt8}, Culong, Ptr{UInt8}, Float128,), buf, lng + 1 , " %.35Qe" , x)
272
+ lng = ccall ((:stringq ,libquadmath_wrapper ), Int32, (Ptr{UInt8}, Culong, Ptr{UInt8}, Float128,), buf, lng + 1 , " %.35Qe" , x)
272
273
return bytestring (pointer (buf), lng)
273
274
end
274
275
@@ -280,12 +281,12 @@ const ROUNDING_MODE = Cint[0]
280
281
281
282
function convert (:: Type{BigFloat} , x:: Float128 )
282
283
z = BigFloat ()
283
- res = ccall ((:mpfr_set_float128_xxx , :libfloat128 ), Int32, (Ptr{BigFloat}, Float128, Int32), & z, x, ROUNDING_MODE[end ])
284
+ res = ccall ((:mpfr_set_float128_xxx , libquadmath_wrapper ), Int32, (Ptr{BigFloat}, Float128, Int32), & z, x, ROUNDING_MODE[end ])
284
285
return z
285
286
end
286
287
287
288
convert (:: Type{Float128} , x:: BigFloat ) =
288
- ccall ((:mpfr_get_float128_xxx , :libfloat128 ), Float128, (Ptr{BigFloat},Int32), & x, ROUNDING_MODE[end ])
289
+ ccall ((:mpfr_get_float128_xxx , libquadmath_wrapper ), Float128, (Ptr{BigFloat},Int32), & x, ROUNDING_MODE[end ])
289
290
290
291
291
292
end
0 commit comments