| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
## This file generated by InlineX::C2XS (version 0.22) using Inline::C (version 0.53) |
|
2
|
|
|
|
|
|
|
package Math::Float128; |
|
3
|
23
|
|
|
23
|
|
9926
|
use warnings; |
|
|
23
|
|
|
|
|
148
|
|
|
|
23
|
|
|
|
|
603
|
|
|
4
|
23
|
|
|
23
|
|
103
|
use strict; |
|
|
23
|
|
|
|
|
35
|
|
|
|
23
|
|
|
|
|
379
|
|
|
5
|
|
|
|
|
|
|
|
|
6
|
23
|
|
|
23
|
|
7913
|
use Math::Float128::Constant; |
|
|
23
|
|
|
|
|
50
|
|
|
|
23
|
|
|
|
|
6083
|
|
|
7
|
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
require Exporter; |
|
9
|
|
|
|
|
|
|
*import = \&Exporter::import; |
|
10
|
|
|
|
|
|
|
require DynaLoader; |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
use overload |
|
13
|
23
|
|
|
|
|
551
|
'+' => \&_overload_add, |
|
14
|
|
|
|
|
|
|
'*' => \&_overload_mul, |
|
15
|
|
|
|
|
|
|
'-' => \&_overload_sub, |
|
16
|
|
|
|
|
|
|
'/' => \&_overload_div, |
|
17
|
|
|
|
|
|
|
'**' => \&_overload_pow, |
|
18
|
|
|
|
|
|
|
'+=' => \&_overload_add_eq, |
|
19
|
|
|
|
|
|
|
'*=' => \&_overload_mul_eq, |
|
20
|
|
|
|
|
|
|
'-=' => \&_overload_sub_eq, |
|
21
|
|
|
|
|
|
|
'/=' => \&_overload_div_eq, |
|
22
|
|
|
|
|
|
|
'**=' => \&_overload_pow_eq, |
|
23
|
|
|
|
|
|
|
'==' => \&_overload_equiv, |
|
24
|
|
|
|
|
|
|
'""' => \&_overload_string, |
|
25
|
|
|
|
|
|
|
'!=' => \&_overload_not_equiv, |
|
26
|
|
|
|
|
|
|
'bool' => \&_overload_true, |
|
27
|
|
|
|
|
|
|
'!' => \&_overload_not, |
|
28
|
|
|
|
|
|
|
'=' => \&_overload_copy, |
|
29
|
|
|
|
|
|
|
'<' => \&_overload_lt, |
|
30
|
|
|
|
|
|
|
'<=' => \&_overload_lte, |
|
31
|
|
|
|
|
|
|
'>' => \&_overload_gt, |
|
32
|
|
|
|
|
|
|
'>=' => \&_overload_gte, |
|
33
|
|
|
|
|
|
|
'<=>' => \&_overload_spaceship, |
|
34
|
|
|
|
|
|
|
'abs' => \&_overload_abs, |
|
35
|
|
|
|
|
|
|
'int' => \&_overload_int, |
|
36
|
|
|
|
|
|
|
'sqrt' => \&_overload_sqrt, |
|
37
|
|
|
|
|
|
|
'log' => \&_overload_log, |
|
38
|
|
|
|
|
|
|
'exp' => \&_overload_exp, |
|
39
|
|
|
|
|
|
|
'sin' => \&_overload_sin, |
|
40
|
|
|
|
|
|
|
'cos' => \&_overload_cos, |
|
41
|
|
|
|
|
|
|
'atan2' => \&_overload_atan2, |
|
42
|
|
|
|
|
|
|
'++' => \&_overload_inc, |
|
43
|
|
|
|
|
|
|
'--' => \&_overload_dec, |
|
44
|
23
|
|
|
23
|
|
23095
|
; |
|
|
23
|
|
|
|
|
20417
|
|
|
45
|
|
|
|
|
|
|
|
|
46
|
23
|
|
|
23
|
|
7191
|
use constant F128_PV_NV_BUG => Math::Float128::Constant::_has_pv_nv_bug(); |
|
|
23
|
|
|
|
|
42
|
|
|
|
23
|
|
|
|
|
2455
|
|
|
47
|
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
# Inspired by https://github.com/Perl/perl5/issues/19550: |
|
49
|
23
|
|
|
23
|
|
138
|
use constant ISSUE_19550 => Math::Float128::Constant::_issue_19550(); |
|
|
23
|
|
|
|
|
38
|
|
|
|
23
|
|
|
|
|
85
|
|
|
50
|
|
|
|
|
|
|
|
|
51
|
23
|
|
|
|
|
108
|
use subs qw(FLT128_DIG FLT128_MANT_DIG FLT128_MIN_EXP FLT128_MAX_EXP FLT128_MIN_10_EXP FLT128_MAX_10_EXP |
|
52
|
|
|
|
|
|
|
M_Eq M_LOG2Eq M_LOG10Eq M_LN2q M_LN10q M_PIq M_PI_2q M_PI_4q M_1_PIq M_2_PIq |
|
53
|
|
|
|
|
|
|
M_2_SQRTPIq M_SQRT2q M_SQRT1_2q |
|
54
|
23
|
|
|
23
|
|
11206
|
FLT128_MAX FLT128_MIN FLT128_EPSILON FLT128_DENORM_MIN); |
|
|
23
|
|
|
|
|
599
|
|
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
$Math::Float128::VERSION = '0.16'; |
|
57
|
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
Math::Float128->DynaLoader::bootstrap($Math::Float128::VERSION); |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
@Math::Float128::EXPORT = (); |
|
61
|
|
|
|
|
|
|
@Math::Float128::EXPORT_OK = qw( |
|
62
|
|
|
|
|
|
|
F128_PV_NV_BUG |
|
63
|
|
|
|
|
|
|
flt128_set_prec flt128_get_prec InfF128 NaNF128 ZeroF128 UnityF128 is_NaNF128 |
|
64
|
|
|
|
|
|
|
is_InfF128 is_InfF128 is_ZeroF128 STRtoF128 NVtoF128 IVtoF128 UVtoF128 F128toSTR |
|
65
|
|
|
|
|
|
|
F128toSTRP F128toF128 F128toNV |
|
66
|
|
|
|
|
|
|
FLT128_DIG FLT128_MANT_DIG FLT128_MIN_EXP FLT128_MAX_EXP FLT128_MIN_10_EXP FLT128_MAX_10_EXP |
|
67
|
|
|
|
|
|
|
M_Eq M_LOG2Eq M_LOG10Eq M_LN2q M_LN10q M_PIq M_PI_2q M_PI_4q M_1_PIq M_2_PIq |
|
68
|
|
|
|
|
|
|
M_2_SQRTPIq M_SQRT2q M_SQRT1_2q |
|
69
|
|
|
|
|
|
|
FLT128_MAX FLT128_MIN FLT128_EPSILON FLT128_DENORM_MIN |
|
70
|
|
|
|
|
|
|
cmp2NV f128_bytes |
|
71
|
|
|
|
|
|
|
acos_F128 acosh_F128 asin_F128 asinh_F128 atan_F128 atanh_F128 atan2_F128 cbrt_F128 ceil_F128 |
|
72
|
|
|
|
|
|
|
copysign_F128 cosh_F128 cos_F128 erf_F128 erfc_F128 exp_F128 expm1_F128 fabs_F128 fdim_F128 |
|
73
|
|
|
|
|
|
|
finite_F128 floor_F128 fma_F128 fmax_F128 fmin_F128 fmod_F128 frexp_F128 hypot_F128 isinf_F128 |
|
74
|
|
|
|
|
|
|
ilogb_F128 isnan_F128 j0_F128 j1_F128 jn_F128 ldexp_F128 lgamma_F128 llrint_F128 llround_F128 |
|
75
|
|
|
|
|
|
|
log_F128 log10_F128 log2_F128 log1p_F128 lrint_F128 lround_F128 modf_F128 nan_F128 |
|
76
|
|
|
|
|
|
|
nearbyint_F128 nextafter_F128 pow_F128 remainder_F128 remquo_F128 rint_F128 round_F128 |
|
77
|
|
|
|
|
|
|
scalbln_F128 scalbn_F128 signbit_F128 sincos_F128 sinh_F128 sin_F128 sqrt_F128 tan_F128 |
|
78
|
|
|
|
|
|
|
tanh_F128 tgamma_F128 trunc_F128 y0_F128 y1_F128 yn_F128 |
|
79
|
|
|
|
|
|
|
fromSTR fromNV fromIV fromUV fromF128 |
|
80
|
|
|
|
|
|
|
); |
|
81
|
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
%Math::Float128::EXPORT_TAGS = (all => [qw( |
|
83
|
|
|
|
|
|
|
F128_PV_NV_BUG |
|
84
|
|
|
|
|
|
|
flt128_set_prec flt128_get_prec InfF128 NaNF128 ZeroF128 UnityF128 is_NaNF128 |
|
85
|
|
|
|
|
|
|
is_InfF128 is_InfF128 is_ZeroF128 STRtoF128 NVtoF128 IVtoF128 UVtoF128 F128toSTR |
|
86
|
|
|
|
|
|
|
F128toSTRP F128toF128 F128toNV |
|
87
|
|
|
|
|
|
|
FLT128_DIG FLT128_MANT_DIG FLT128_MIN_EXP FLT128_MAX_EXP FLT128_MIN_10_EXP FLT128_MAX_10_EXP |
|
88
|
|
|
|
|
|
|
M_Eq M_LOG2Eq M_LOG10Eq M_LN2q M_LN10q M_PIq M_PI_2q M_PI_4q M_1_PIq M_2_PIq |
|
89
|
|
|
|
|
|
|
M_2_SQRTPIq M_SQRT2q M_SQRT1_2q |
|
90
|
|
|
|
|
|
|
FLT128_MAX FLT128_MIN FLT128_EPSILON FLT128_DENORM_MIN |
|
91
|
|
|
|
|
|
|
cmp2NV f128_bytes |
|
92
|
|
|
|
|
|
|
acos_F128 acosh_F128 asin_F128 asinh_F128 atan_F128 atanh_F128 atan2_F128 cbrt_F128 ceil_F128 |
|
93
|
|
|
|
|
|
|
copysign_F128 cosh_F128 cos_F128 erf_F128 erfc_F128 exp_F128 expm1_F128 fabs_F128 fdim_F128 |
|
94
|
|
|
|
|
|
|
finite_F128 floor_F128 fma_F128 fmax_F128 fmin_F128 fmod_F128 frexp_F128 hypot_F128 isinf_F128 |
|
95
|
|
|
|
|
|
|
ilogb_F128 isnan_F128 j0_F128 j1_F128 jn_F128 ldexp_F128 lgamma_F128 llrint_F128 llround_F128 |
|
96
|
|
|
|
|
|
|
log_F128 log10_F128 log2_F128 log1p_F128 lrint_F128 lround_F128 modf_F128 nan_F128 |
|
97
|
|
|
|
|
|
|
nearbyint_F128 nextafter_F128 pow_F128 remainder_F128 remquo_F128 rint_F128 round_F128 |
|
98
|
|
|
|
|
|
|
scalbln_F128 scalbn_F128 signbit_F128 sincos_F128 sinh_F128 sin_F128 sqrt_F128 tan_F128 |
|
99
|
|
|
|
|
|
|
tanh_F128 tgamma_F128 trunc_F128 y0_F128 y1_F128 yn_F128 |
|
100
|
|
|
|
|
|
|
fromSTR fromNV fromIV fromUV fromF128 |
|
101
|
|
|
|
|
|
|
)]); |
|
102
|
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
$Math::Float128::NOK_POK = 0; # Set to 1 to allow warnings in new() and overloaded operations when |
|
104
|
|
|
|
|
|
|
# a scalar that has set both NOK (NV) and POK (PV) flags is encountered |
|
105
|
|
|
|
|
|
|
|
|
106
|
23
|
|
|
23
|
0
|
24412
|
sub dl_load_flags {0} # Prevent DynaLoader from complaining and croaking |
|
107
|
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
sub _overload_string { |
|
109
|
|
|
|
|
|
|
|
|
110
|
8
|
100
|
|
8
|
|
207
|
if(is_ZeroF128($_[0])) { |
|
111
|
4
|
100
|
|
|
|
13
|
return '-0' if is_ZeroF128($_[0]) < 0; |
|
112
|
2
|
|
|
|
|
5
|
return '0'; |
|
113
|
|
|
|
|
|
|
} |
|
114
|
|
|
|
|
|
|
|
|
115
|
4
|
100
|
|
|
|
17
|
if(is_NaNF128($_[0])) {return 'NaN'} |
|
|
2
|
|
|
|
|
7
|
|
|
116
|
|
|
|
|
|
|
|
|
117
|
2
|
|
|
|
|
7
|
my $inf = is_InfF128($_[0]); |
|
118
|
2
|
100
|
|
|
|
7
|
return '-Inf' if $inf < 0; |
|
119
|
1
|
50
|
|
|
|
14
|
return 'Inf' if $inf > 0; |
|
120
|
|
|
|
|
|
|
|
|
121
|
0
|
|
|
|
|
0
|
my @p = split /e/i, F128toSTR($_[0]); |
|
122
|
0
|
|
0
|
|
|
0
|
while(substr($p[0], -1, 1) eq '0' && substr($p[0], -2, 1) ne '.') { |
|
123
|
0
|
|
|
|
|
0
|
chop $p[0]; |
|
124
|
|
|
|
|
|
|
} |
|
125
|
0
|
|
|
|
|
0
|
return $p[0] . 'e' . $p[1]; |
|
126
|
|
|
|
|
|
|
} |
|
127
|
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
sub new { |
|
129
|
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
# This function caters for 2 possibilities: |
|
131
|
|
|
|
|
|
|
# 1) that 'new' has been called as a method - in which |
|
132
|
|
|
|
|
|
|
# case there will be a maximum of 2 args |
|
133
|
|
|
|
|
|
|
# 2) that 'new' has been called as a function - in |
|
134
|
|
|
|
|
|
|
# which case there will be a maximum of 1 arg. |
|
135
|
|
|
|
|
|
|
# If there are no args, then we just want to return a |
|
136
|
|
|
|
|
|
|
# Math::Float128 object that's a NaN. |
|
137
|
|
|
|
|
|
|
|
|
138
|
450
|
50
|
|
450
|
0
|
12131
|
if(!@_) {return NaNF128()} |
|
|
0
|
|
|
|
|
0
|
|
|
139
|
|
|
|
|
|
|
|
|
140
|
450
|
50
|
|
|
|
734
|
if(@_ > 2) {die "More than 2 arguments supplied to new()"} |
|
|
0
|
|
|
|
|
0
|
|
|
141
|
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
# If 'new' has been called OOP style, the first arg is the string |
|
143
|
|
|
|
|
|
|
# "Math::Float128" which we don't need - so let's remove it. However, |
|
144
|
|
|
|
|
|
|
# if the first arg is a Math::Float128 object (which is a possibility), |
|
145
|
|
|
|
|
|
|
# then we'll get a fatal error when we check it for equivalence to |
|
146
|
|
|
|
|
|
|
# the string "Math::Float128". So we first need to check that it's |
|
147
|
|
|
|
|
|
|
# not an object - which we'll do by using the ref() function: |
|
148
|
450
|
100
|
100
|
|
|
1218
|
if(!ref($_[0]) && $_[0] eq "Math::Float128") { |
|
149
|
444
|
|
|
|
|
505
|
shift; |
|
150
|
444
|
100
|
|
|
|
668
|
if(!@_) {return NaNF128()} |
|
|
8
|
|
|
|
|
59
|
|
|
151
|
|
|
|
|
|
|
} |
|
152
|
|
|
|
|
|
|
|
|
153
|
442
|
50
|
|
|
|
633
|
if(@_ > 1) {die "Too many arguments supplied to new() - expected no more than 1"} |
|
|
0
|
|
|
|
|
0
|
|
|
154
|
|
|
|
|
|
|
|
|
155
|
442
|
|
|
|
|
526
|
my $arg = shift; # At this point, an infnan might acquire a POK flag - thus |
|
156
|
|
|
|
|
|
|
# assigning to $type a value of 4, instead of 3. Such behaviour also |
|
157
|
|
|
|
|
|
|
# turns $arg into a PV and NV dualvar. It's a fairly inconsequential |
|
158
|
|
|
|
|
|
|
# bug - https://github.com/Perl/perl5/issues/19550. |
|
159
|
|
|
|
|
|
|
# I could workaround this by simply not shifting and re-assigning, but |
|
160
|
|
|
|
|
|
|
# I'll leave it as it is - otherwise there's nothing to mark that this |
|
161
|
|
|
|
|
|
|
# minor issue (which might also show up in user code) ever existed. |
|
162
|
442
|
|
|
|
|
1066
|
my $type = _itsa($arg); |
|
163
|
|
|
|
|
|
|
|
|
164
|
442
|
100
|
|
|
|
864
|
return UVtoF128 ($arg) if $type == 1; #UV |
|
165
|
417
|
100
|
|
|
|
1483
|
return IVtoF128 ($arg) if $type == 2; #IV |
|
166
|
|
|
|
|
|
|
|
|
167
|
267
|
100
|
|
|
|
397
|
if($type == 4) { #PV |
|
168
|
98
|
100
|
|
|
|
221
|
if(_SvNOK($arg)) { |
|
169
|
6
|
|
|
|
|
34
|
set_nok_pok(nok_pokflag() + 1); |
|
170
|
6
|
50
|
|
|
|
14
|
if($Math::Float128::NOK_POK) { |
|
171
|
0
|
|
|
|
|
0
|
warn "Scalar passed to new() is both NV and PV. Using PV (string) value"; |
|
172
|
|
|
|
|
|
|
} |
|
173
|
|
|
|
|
|
|
} |
|
174
|
98
|
|
|
|
|
678
|
return STRtoF128($arg); |
|
175
|
|
|
|
|
|
|
} |
|
176
|
|
|
|
|
|
|
|
|
177
|
169
|
100
|
|
|
|
255
|
if($type == 3) { # NV |
|
178
|
|
|
|
|
|
|
|
|
179
|
142
|
|
|
|
|
141
|
if(F128_PV_NV_BUG) { |
|
180
|
|
|
|
|
|
|
if(_SvPOK($arg)) { |
|
181
|
|
|
|
|
|
|
set_nok_pok(nok_pokflag() + 1); |
|
182
|
|
|
|
|
|
|
if($Math::Float128::NOK_POK) { |
|
183
|
|
|
|
|
|
|
warn "Scalar passed to new() is both NV and PV. Using NV (numeric) value"; |
|
184
|
|
|
|
|
|
|
} |
|
185
|
|
|
|
|
|
|
} |
|
186
|
|
|
|
|
|
|
} |
|
187
|
|
|
|
|
|
|
|
|
188
|
142
|
100
|
|
|
|
239
|
if($arg == 0) {return NVtoF128($arg)} |
|
|
2
|
|
|
|
|
8
|
|
|
189
|
140
|
100
|
|
|
|
240
|
if($arg != $arg) { return NaNF128()} |
|
|
2
|
|
|
|
|
24
|
|
|
190
|
138
|
100
|
|
|
|
220
|
if(($arg / $arg) != 1) { # Inf |
|
191
|
4
|
100
|
|
|
|
10
|
if($arg < 0) {return InfF128(-1)} |
|
|
2
|
|
|
|
|
21
|
|
|
192
|
2
|
|
|
|
|
8
|
return InfF128(1); |
|
193
|
|
|
|
|
|
|
} |
|
194
|
134
|
|
|
|
|
864
|
return NVtoF128($arg); |
|
195
|
|
|
|
|
|
|
} |
|
196
|
|
|
|
|
|
|
|
|
197
|
27
|
50
|
|
|
|
52
|
if($type == 113) { # Math::Float128 |
|
198
|
27
|
|
|
|
|
138
|
return F128toF128($arg); |
|
199
|
|
|
|
|
|
|
} |
|
200
|
|
|
|
|
|
|
|
|
201
|
0
|
|
|
|
|
0
|
die "Bad argument given to new"; |
|
202
|
|
|
|
|
|
|
} |
|
203
|
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
sub f128_bytes { |
|
206
|
1
|
|
|
1
|
0
|
69
|
my @ret = _f128_bytes($_[0]); |
|
207
|
1
|
|
|
|
|
6
|
return join '', @ret; |
|
208
|
|
|
|
|
|
|
} |
|
209
|
|
|
|
|
|
|
|
|
210
|
2
|
|
|
2
|
|
242
|
sub FLT128_DIG () {return _FLT128_DIG()} |
|
211
|
1
|
|
|
1
|
|
36
|
sub FLT128_MAX () {return _FLT128_MAX()} |
|
212
|
1
|
|
|
1
|
|
41
|
sub FLT128_MIN () {return _FLT128_MIN()} |
|
213
|
1
|
|
|
1
|
|
22
|
sub FLT128_EPSILON () {return _FLT128_EPSILON()} |
|
214
|
1
|
|
|
1
|
|
42
|
sub FLT128_DENORM_MIN () {return _FLT128_DENORM_MIN()} |
|
215
|
1
|
|
|
1
|
|
34
|
sub FLT128_MANT_DIG () {return _FLT128_MANT_DIG()} |
|
216
|
1
|
|
|
1
|
|
13
|
sub FLT128_MIN_EXP () {return _FLT128_MIN_EXP()} |
|
217
|
1
|
|
|
1
|
|
11
|
sub FLT128_MAX_EXP () {return _FLT128_MAX_EXP()} |
|
218
|
1
|
|
|
1
|
|
11
|
sub FLT128_MIN_10_EXP () {return _FLT128_MIN_10_EXP()} |
|
219
|
1
|
|
|
1
|
|
11
|
sub FLT128_MAX_10_EXP () {return _FLT128_MAX_10_EXP()} |
|
220
|
1
|
|
|
1
|
|
38
|
sub M_Eq () {return _M_Eq()} |
|
221
|
1
|
|
|
1
|
|
21
|
sub M_LOG2Eq () {return _M_LOG2Eq()} |
|
222
|
1
|
|
|
1
|
|
34
|
sub M_LOG10Eq () {return _M_LOG10Eq()} |
|
223
|
1
|
|
|
1
|
|
16
|
sub M_LN2q () {return _M_LN2q()} |
|
224
|
1
|
|
|
1
|
|
18
|
sub M_LN10q () {return _M_LN10q()} |
|
225
|
1
|
|
|
1
|
|
16
|
sub M_PIq () {return _M_PIq()} |
|
226
|
1
|
|
|
1
|
|
16
|
sub M_PI_2q () {return _M_PI_2q()} |
|
227
|
1
|
|
|
1
|
|
17
|
sub M_PI_4q () {return _M_PI_4q()} |
|
228
|
1
|
|
|
1
|
|
30
|
sub M_1_PIq () {return _M_1_PIq()} |
|
229
|
1
|
|
|
1
|
|
23
|
sub M_2_PIq () {return _M_2_PIq()} |
|
230
|
1
|
|
|
1
|
|
16
|
sub M_2_SQRTPIq () {return _M_2_SQRTPIq()} |
|
231
|
1
|
|
|
1
|
|
30
|
sub M_SQRT2q () {return _M_SQRT2q()} |
|
232
|
1
|
|
|
1
|
|
21
|
sub M_SQRT1_2q () {return _M_SQRT1_2q()} |
|
233
|
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
1; |
|
235
|
|
|
|
|
|
|
|