@@ -3,7 +3,7 @@ module Quadmath
3
3
export Float128, Complex256
4
4
5
5
import
6
- Base: + , - , ( * ), / , < , <= , == , > , >= , ^ , convert, promote_rule,
6
+ Base: ( * ), + , - , / , < , <= , == , > , >= , ^ , convert, promote_rule,
7
7
string, print, show, showcompact, tryparse,
8
8
acos, acosh, asin, asinh, atan, atanh, cosh, cos,
9
9
erf, erfc, expm1, log, log2, log10, sin, sinh, sqrt,
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
22
22
# Note: with "<: AbstracFloat" multiplication of two Float128 numbers
23
23
# mysteriously doesn't work!
24
24
@@ -27,6 +27,11 @@ typealias Complex256 Complex{Float128}
27
27
const libquadmath_wrapper = joinpath (dirname (@__FILE__ ),
28
28
" .." , " deps" , " usr" , " lib" , " libquadmath_wrapper.so" )
29
29
30
+
31
+ widen (:: Type{Float64} ) = Float128
32
+ widen (:: Type{Float128} ) = BigFloat
33
+
34
+
30
35
convert (:: Type{Float128} , x:: Float128 ) = x
31
36
32
37
convert (:: Type{Float128} , x:: Clong ) =
@@ -59,21 +64,30 @@ call(::Type{Float16}, x::Float128, r::RoundingMode) =
59
64
convert (Float16, call (Float32, x, r))
60
65
61
66
62
- promote_rule {T<:Real} (:: Type{Float128} , :: Type{T} ) = Float128
63
- promote_rule {T<:AbstractFloat} (:: Type{Float128} ,:: Type{T} ) = Float128
67
+ # promote_rule{T<:Real}(::Type{Float128}, ::Type{T}) = Float128
68
+ # promote_rule{T<:AbstractFloat}(::Type{Float128},::Type{T}) = Float128
69
+
70
+ promote_rule (:: Type{Float128} , :: Type{Float32} ) = Float128
71
+ promote_rule (:: Type{Float128} , :: Type{Float64} ) = Float128
64
72
65
73
66
74
function tryparse (:: Type{Float128} , s:: AbstractString , base:: Int = 0 )
67
75
Nullable (ccall ((:set_str_q , libquadmath_wrapper), Float128, (Cstring, ), s))
68
76
end
69
77
70
78
# Basic arithmetic without promotion
71
- for (fJ, fC) in ((:+ ,:add ), (:- ,:sub ), (:/ ,:div ), (:(* ),:mul ))
72
- @eval begin
73
- # Float128
74
- function ($ fJ)(x:: Float128 , y:: Float128 )
75
- ccall (($ (string (fC,:_q )),libquadmath_wrapper), Float128, (Float128, Float128), x, y)
79
+ for (fJ, fC) in ((:+ ,:add ), (:- ,:sub ), (:/ ,:div ), (:* ,:mul ))
80
+
81
+ # Float128
82
+ if (fC!= (:mul )) # 1st part of mysterious hack to get multiplication work
83
+ @eval begin
84
+ function ($ fJ)(x:: Float128 , y:: Float128 )
85
+ ccall (($ (string (fC,:_q )),libquadmath_wrapper), Float128, (Float128, Float128), x, y)
86
+ end
76
87
end
88
+ end
89
+
90
+ @eval begin
77
91
78
92
# Unsigned Integer
79
93
function ($ fJ)(x:: Float128 , y:: CulongMax )
@@ -103,9 +117,12 @@ for (fJ, fC) in ((:+,:add), (:-,:sub), (:/,:div), (:(*),:mul))
103
117
end
104
118
end
105
119
end
120
+ # 1st part of mysterious hack to get multiplication work
121
+ # Defining * in this way works, very strange...
122
+ * (x:: Float128 , y:: Float128 ) = ccall ((" mul_q" ,libquadmath_wrapper), Float128, (Float128, Float128), x, y)
106
123
107
124
# Basic complex arithmetic without promotion
108
- for (fJ, fC) in ((:+ ,:cadd ), (:- ,:csub ), (:/ ,:cdiv ), (:( * ) ,:cmul ))
125
+ for (fJ, fC) in ((:+ ,:cadd ), (:- ,:csub ), (:/ ,:cdiv ), (:* ,:cmul ))
109
126
@eval begin
110
127
# Float128
111
128
function ($ fJ)(x:: Complex256 , y:: Complex256 )
0 commit comments