82
82
# and passed on the xmm registers, matching the x86_64 ABI for __float128.
83
83
const Cfloat128 = NTuple{2 ,VecElement{Float64}}
84
84
85
- struct Float128 <: AbstractFloat
86
- data:: Cfloat128
87
- function Float128 (data:: Cfloat128 )
88
- new (data)
89
- end
90
- end
85
+ primitive type Float128 <: AbstractFloat 128 end
86
+ Float128 (data:: Cfloat128 ) = reinterpret (Float128, data)
87
+
91
88
convert (:: Type{Float128} , x:: Number ) = Float128 (x)
92
89
93
90
const ComplexF128 = Complex{Float128}
94
91
95
- Base. cconvert (:: Type{Cfloat128} , x:: Float128 ) = x. data
96
- Base. cconvert (:: Type{Ref{Cfloat128}} , x:: Float128 ) = Ref {Cfloat128} (x. data)
97
-
92
+ Base. cconvert (:: Type{Cfloat128} , x:: Float128 ) = reinterpret (Cfloat128, x)
93
+ Base. cconvert (:: Type{Ref{Cfloat128}} , x:: Float128 ) = Ref (Cfloat128 (x))
98
94
99
95
# reinterpret
100
- function reinterpret (:: Type{UInt128} , x:: Float128 )
101
- hi = reinterpret (UInt64, x. data[2 ]. value)
102
- lo = reinterpret (UInt64, x. data[1 ]. value)
103
- UInt128 (hi) << 64 | lo
104
- end
105
- function reinterpret (:: Type{Float128} , x:: UInt128 )
106
- fhi = reinterpret (Float64, (x >> 64 ) % UInt64)
107
- flo = reinterpret (Float64, x % UInt64)
108
- Float128 ((VecElement (flo), VecElement (fhi)))
109
- end
110
96
reinterpret (:: Type{Unsigned} , x:: Float128 ) = reinterpret (UInt128, x)
111
97
reinterpret (:: Type{Signed} , x:: Float128 ) = reinterpret (Int128, x)
112
98
113
- reinterpret (:: Type{Int128} , x:: Float128 ) =
114
- reinterpret (Int128, reinterpret (UInt128, x))
115
- reinterpret (:: Type{Float128} , x:: Int128 ) =
116
- reinterpret (Float128, reinterpret (UInt128, x))
117
-
118
99
sign_mask (:: Type{Float128} ) = 0x8000_0000_0000_0000_0000_0000_0000_0000
119
100
exponent_mask (:: Type{Float128} ) = 0x7fff_0000_0000_0000_0000_0000_0000_0000
120
101
exponent_one (:: Type{Float128} ) = 0x3fff_0000_0000_0000_0000_0000_0000_0000
@@ -481,20 +462,10 @@ end
481
462
482
463
function BigFloat (x:: Float128 ; precision= precision (BigFloat))
483
464
if ! isfinite (x) || iszero (x)
484
- @static if VERSION < v " 1.1"
485
- return BigFloat (Float64 (x), precision)
486
- else
487
- return BigFloat (Float64 (x), precision= precision)
488
- end
465
+ return BigFloat (Float64 (x), precision= precision)
489
466
end
490
467
491
- @static if VERSION < v " 1.1"
492
- b = setprecision (BigFloat, max (precision,113 )) do
493
- BigFloat ()
494
- end
495
- else
496
- b = BigFloat (precision= max (precision,113 ))
497
- end
468
+ b = BigFloat (precision= max (precision,113 ))
498
469
499
470
y, k = frexp (x)
500
471
b. exp = Clong (k)
@@ -514,16 +485,7 @@ function BigFloat(x::Float128; precision=precision(BigFloat))
514
485
end
515
486
516
487
if precision < 113
517
- @static if VERSION < v " 1.1"
518
- b2 = setprecision (BigFloat, precision) do
519
- BigFloat ()
520
- end
521
- ccall ((:mpfr_set , :libmpfr ), Int32, (Ref{BigFloat}, Ref{BigFloat}, Int32),
522
- b2, b, MPFR. ROUNDING_MODE[])
523
- return b2
524
- else
525
- return BigFloat (b, precision= precision)
526
- end
488
+ return BigFloat (b, precision= precision)
527
489
else
528
490
return b
529
491
end
@@ -545,16 +507,7 @@ function Float128(x::BigFloat)
545
507
z = reinterpret (Float128, UInt128 (0 ))
546
508
end
547
509
548
- @static if VERSION < v " 1.1"
549
- y = setprecision (BigFloat, prec) do
550
- BigFloat ()
551
- end
552
- ccall ((:mpfr_set , :libmpfr ), Int32, (Ref{BigFloat}, Ref{BigFloat}, Int32),
553
- y, x, MPFR. ROUNDING_MODE[])
554
- else
555
- y = BigFloat (x, precision= prec)
556
- end
557
-
510
+ y = BigFloat (x, precision= prec)
558
511
u = zero (UInt128)
559
512
i = cld (prec, sizeof (MPFR. Limb)* 8 )
560
513
j = 113
@@ -574,13 +527,7 @@ function BigInt(x::Float128)
574
527
BigInt (BigFloat (x, precision= precision (Float128)))
575
528
end
576
529
function Float128 (x:: BigInt )
577
- @static if VERSION < v " 1.1"
578
- y = setprecision (BigFloat, precision (Float128)) do
579
- BigFloat (x)
580
- end
581
- else
582
- y = BigFloat (x, precision= precision (Float128))
583
- end
530
+ y = BigFloat (x, precision= precision (Float128))
584
531
Float128 (y)
585
532
end
586
533
0 commit comments