authorgravatar for rpkak@noreply.codeberg.orgrpkak <rpkak@noreply.codeberg.org> 2026-01-04 19:23:43+01:00
committergravatar for rpkak@noreply.codeberg.orgrpkak <rpkak@noreply.codeberg.org> 2026-01-04 19:23:43+01:00
log81097669270c9f525eb0556915bdbcc3492fcec3
treeda0dc2196e05a1e2f6cc55075e602b557b1b2667
parenteab93d3574887512ac86c5ae47805b0184277fd8
signaturebadge-check Signed by SSH key SHA256:A2g6ATENrgLKQcUdthsn72P0njmQxnHSimzwnyJsZzo

compiler_rt: fix exp, exp2, log, log10 and log2

the log update is a port of the current version from musl

5 files changed, 357 insertions(+), 76 deletions(-)

lib/compiler_rt/exp.zig+3-8
...@@ -13,8 +13,6 @@ const expect = std.testing.expect;...@@ -13,8 +13,6 @@ const expect = std.testing.expect;
13const expectEqual = std.testing.expectEqual;13const expectEqual = std.testing.expectEqual;
14const common = @import("common.zig");14const common = @import("common.zig");
1515
16pub const panic = common.panic;
17
18comptime {16comptime {
19 @export(&__exph, .{ .name = "__exph", .linkage = common.linkage, .visibility = common.visibility });17 @export(&__exph, .{ .name = "__exph", .linkage = common.linkage, .visibility = common.visibility });
20 @export(&expf, .{ .name = "expf", .linkage = common.linkage, .visibility = common.visibility });18 @export(&expf, .{ .name = "expf", .linkage = common.linkage, .visibility = common.visibility });
...@@ -136,14 +134,11 @@ pub fn exp(x_: f64) callconv(.c) f64 {...@@ -136,14 +134,11 @@ pub fn exp(x_: f64) callconv(.c) f64 {
136 }134 }
137 if (x > 709.782712893383973096) {135 if (x > 709.782712893383973096) {
138 // overflow if x != inf136 // overflow if x != inf
139 if (!math.isInf(x)) {137 return if (common.want_float_exceptions) x * 0x1p1023 else std.math.inf(f64);
140 math.raiseOverflow();
141 }
142 return math.inf(f64);
143 }138 }
144 if (x < -708.39641853226410622) {139 if (x < -708.39641853226410622) {
145 // underflow if x != -inf140 // underflow if x != -inf
146 // if (common.want_float_exceptions) mem.doNotOptimizeAway(@as(f32, -0x1.0p-149 / x));141 if (common.want_float_exceptions) mem.doNotOptimizeAway(-0x0.0000000000001p-1022 / x);
147 if (x < -745.13321910194110842) {142 if (x < -745.13321910194110842) {
148 return 0;143 return 0;
149 }144 }
...@@ -176,7 +171,7 @@ pub fn exp(x_: f64) callconv(.c) f64 {...@@ -176,7 +171,7 @@ pub fn exp(x_: f64) callconv(.c) f64 {
176 lo = 0;171 lo = 0;
177 } else {172 } else {
178 // inexact if x != 0173 // inexact if x != 0
179 // if (common.want_float_exceptions) mem.doNotOptimizeAway(0x1.0p1023 + x);174 if (common.want_float_exceptions) mem.doNotOptimizeAway(0x1.0p1023 + x);
180 return 1 + x;175 return 1 + x;
181 }176 }
182177
lib/compiler_rt/exp2.zig+1-4
...@@ -13,8 +13,6 @@ const expect = std.testing.expect;...@@ -13,8 +13,6 @@ const expect = std.testing.expect;
13const expectEqual = std.testing.expectEqual;13const expectEqual = std.testing.expectEqual;
14const common = @import("common.zig");14const common = @import("common.zig");
1515
16pub const panic = common.panic;
17
18comptime {16comptime {
19 @export(&__exp2h, .{ .name = "__exp2h", .linkage = common.linkage, .visibility = common.visibility });17 @export(&__exp2h, .{ .name = "__exp2h", .linkage = common.linkage, .visibility = common.visibility });
20 @export(&exp2f, .{ .name = "exp2f", .linkage = common.linkage, .visibility = common.visibility });18 @export(&exp2f, .{ .name = "exp2f", .linkage = common.linkage, .visibility = common.visibility });
...@@ -110,8 +108,7 @@ pub fn exp2(x: f64) callconv(.c) f64 {...@@ -110,8 +108,7 @@ pub fn exp2(x: f64) callconv(.c) f64 {
110 if (ix >= 0x408FF000) {108 if (ix >= 0x408FF000) {
111 // x >= 1024 or nan109 // x >= 1024 or nan
112 if (ix >= 0x40900000 and ux >> 63 == 0) {110 if (ix >= 0x40900000 and ux >> 63 == 0) {
113 math.raiseOverflow();111 return if (common.want_float_exceptions) x * 0x1p1023 else std.math.inf(f64);
114 return math.inf(f64);
115 }112 }
116 // -inf or -nan113 // -inf or -nan
117 if (ix >= 0x7FF00000) {114 if (ix >= 0x7FF00000) {
lib/compiler_rt/log.zig+345-52
...@@ -1,8 +1,8 @@...@@ -1,8 +1,8 @@
1//! Ported from musl, which is licensed under the MIT license:1//! Ported from musl, which is licensed under the MIT license:
2//! https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT2//! https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT
3//!3//!
4//! https://git.musl-libc.org/cgit/musl/tree/src/math/lnf.c4//! https://git.musl-libc.org/cgit/musl/tree/src/math/logf.c?h=2d7d05f031e014068a61d3076c6178513395d2ae
5//! https://git.musl-libc.org/cgit/musl/tree/src/math/ln.c5//! https://git.musl-libc.org/cgit/musl/tree/src/math/log.c?h=1b76ff0767d01df72f692806ee5adee13c67ef88
66
7const std = @import("std");7const std = @import("std");
8const builtin = @import("builtin");8const builtin = @import("builtin");
...@@ -12,8 +12,6 @@ const expectEqual = std.testing.expectEqual;...@@ -12,8 +12,6 @@ const expectEqual = std.testing.expectEqual;
12const arch = builtin.cpu.arch;12const arch = builtin.cpu.arch;
13const common = @import("common.zig");13const common = @import("common.zig");
1414
15pub const panic = common.panic;
16
17comptime {15comptime {
18 @export(&__logh, .{ .name = "__logh", .linkage = common.linkage, .visibility = common.visibility });16 @export(&__logh, .{ .name = "__logh", .linkage = common.linkage, .visibility = common.visibility });
19 @export(&logf, .{ .name = "logf", .linkage = common.linkage, .visibility = common.visibility });17 @export(&logf, .{ .name = "logf", .linkage = common.linkage, .visibility = common.visibility });
...@@ -47,11 +45,11 @@ pub fn logf(x_: f32) callconv(.c) f32 {...@@ -47,11 +45,11 @@ pub fn logf(x_: f32) callconv(.c) f32 {
47 if (ix < 0x00800000 or ix >> 31 != 0) {45 if (ix < 0x00800000 or ix >> 31 != 0) {
48 // log(+-0) = -inf46 // log(+-0) = -inf
49 if (ix << 1 == 0) {47 if (ix << 1 == 0) {
50 return -math.inf(f32);48 return if (common.want_float_exceptions) -1 / (x * x) else -std.math.inf(f64);
51 }49 }
52 // log(-#) = nan50 // log(-#) = nan
53 if (ix >> 31 != 0) {51 if (ix >> 31 != 0) {
54 return math.nan(f32);52 return if (common.want_float_exceptions) (x - x) / 0.0 else math.nan(f64);
55 }53 }
5654
57 // subnormal, scale x55 // subnormal, scale x
...@@ -83,60 +81,355 @@ pub fn logf(x_: f32) callconv(.c) f32 {...@@ -83,60 +81,355 @@ pub fn logf(x_: f32) callconv(.c) f32 {
83 return s * (hfsq + R) + dk * ln2_lo - hfsq + f + dk * ln2_hi;81 return s * (hfsq + R) + dk * ln2_lo - hfsq + f + dk * ln2_hi;
84}82}
8583
86pub fn log(x_: f64) callconv(.c) f64 {84pub fn log(x: f64) callconv(.c) f64 {
87 const ln2_hi: f64 = 6.93147180369123816490e-01;85 const poly1 = [_]f64{
88 const ln2_lo: f64 = 1.90821492927058770002e-10;86 -0x1p-1,
89 const Lg1: f64 = 6.666666666666735130e-01;87 0x1.5555555555577p-2,
90 const Lg2: f64 = 3.999999999940941908e-01;88 -0x1.ffffffffffdcbp-3,
91 const Lg3: f64 = 2.857142874366239149e-01;89 0x1.999999995dd0cp-3,
92 const Lg4: f64 = 2.222219843214978396e-01;90 -0x1.55555556745a7p-3,
93 const Lg5: f64 = 1.818357216161805012e-01;91 0x1.24924a344de3p-3,
94 const Lg6: f64 = 1.531383769920937332e-01;92 -0x1.fffffa4423d65p-4,
95 const Lg7: f64 = 1.479819860511658591e-01;93 0x1.c7184282ad6cap-4,
94 -0x1.999eb43b068ffp-4,
95 0x1.78182f7afd085p-4,
96 -0x1.5521375d145cdp-4,
97 };
9698
97 var x = x_;99 const poly = [_]f64{
98 var ix: u64 = @bitCast(x);100 -0x1.0000000000001p-1,
99 var hx: u32 = @intCast(ix >> 32);101 0x1.555555551305bp-2,
100 var k: i32 = 0;102 -0x1.fffffffeb459p-3,
103 0x1.999b324f10111p-3,
104 -0x1.55575e506c89fp-3,
105 };
101106
102 if (hx < 0x00100000 or hx >> 31 != 0) {107 const tab = [128]struct { invc: f64, logc: f64 }{
103 // log(+-0) = -inf108 .{ .invc = 0x1.734f0c3e0de9fp+0, .logc = -0x1.7cc7f79e69000p-2 },
104 if (ix << 1 == 0) {109 .{ .invc = 0x1.713786a2ce91fp+0, .logc = -0x1.76feec20d0000p-2 },
105 return -math.inf(f64);110 .{ .invc = 0x1.6f26008fab5a0p+0, .logc = -0x1.713e31351e000p-2 },
106 }111 .{ .invc = 0x1.6d1a61f138c7dp+0, .logc = -0x1.6b85b38287800p-2 },
107 // log(-#) = nan112 .{ .invc = 0x1.6b1490bc5b4d1p+0, .logc = -0x1.65d5590807800p-2 },
108 if (hx >> 31 != 0) {113 .{ .invc = 0x1.69147332f0cbap+0, .logc = -0x1.602d076180000p-2 },
109 return math.nan(f64);114 .{ .invc = 0x1.6719f18224223p+0, .logc = -0x1.5a8ca86909000p-2 },
115 .{ .invc = 0x1.6524f99a51ed9p+0, .logc = -0x1.54f4356035000p-2 },
116 .{ .invc = 0x1.63356aa8f24c4p+0, .logc = -0x1.4f637c36b4000p-2 },
117 .{ .invc = 0x1.614b36b9ddc14p+0, .logc = -0x1.49da7fda85000p-2 },
118 .{ .invc = 0x1.5f66452c65c4cp+0, .logc = -0x1.445923989a800p-2 },
119 .{ .invc = 0x1.5d867b5912c4fp+0, .logc = -0x1.3edf439b0b800p-2 },
120 .{ .invc = 0x1.5babccb5b90dep+0, .logc = -0x1.396ce448f7000p-2 },
121 .{ .invc = 0x1.59d61f2d91a78p+0, .logc = -0x1.3401e17bda000p-2 },
122 .{ .invc = 0x1.5805612465687p+0, .logc = -0x1.2e9e2ef468000p-2 },
123 .{ .invc = 0x1.56397cee76bd3p+0, .logc = -0x1.2941b3830e000p-2 },
124 .{ .invc = 0x1.54725e2a77f93p+0, .logc = -0x1.23ec58cda8800p-2 },
125 .{ .invc = 0x1.52aff42064583p+0, .logc = -0x1.1e9e129279000p-2 },
126 .{ .invc = 0x1.50f22dbb2bddfp+0, .logc = -0x1.1956d2b48f800p-2 },
127 .{ .invc = 0x1.4f38f4734ded7p+0, .logc = -0x1.141679ab9f800p-2 },
128 .{ .invc = 0x1.4d843cfde2840p+0, .logc = -0x1.0edd094ef9800p-2 },
129 .{ .invc = 0x1.4bd3ec078a3c8p+0, .logc = -0x1.09aa518db1000p-2 },
130 .{ .invc = 0x1.4a27fc3e0258ap+0, .logc = -0x1.047e65263b800p-2 },
131 .{ .invc = 0x1.4880524d48434p+0, .logc = -0x1.feb224586f000p-3 },
132 .{ .invc = 0x1.46dce1b192d0bp+0, .logc = -0x1.f474a7517b000p-3 },
133 .{ .invc = 0x1.453d9d3391854p+0, .logc = -0x1.ea4443d103000p-3 },
134 .{ .invc = 0x1.43a2744b4845ap+0, .logc = -0x1.e020d44e9b000p-3 },
135 .{ .invc = 0x1.420b54115f8fbp+0, .logc = -0x1.d60a22977f000p-3 },
136 .{ .invc = 0x1.40782da3ef4b1p+0, .logc = -0x1.cc00104959000p-3 },
137 .{ .invc = 0x1.3ee8f5d57fe8fp+0, .logc = -0x1.c202956891000p-3 },
138 .{ .invc = 0x1.3d5d9a00b4ce9p+0, .logc = -0x1.b81178d811000p-3 },
139 .{ .invc = 0x1.3bd60c010c12bp+0, .logc = -0x1.ae2c9ccd3d000p-3 },
140 .{ .invc = 0x1.3a5242b75dab8p+0, .logc = -0x1.a45402e129000p-3 },
141 .{ .invc = 0x1.38d22cd9fd002p+0, .logc = -0x1.9a877681df000p-3 },
142 .{ .invc = 0x1.3755bc5847a1cp+0, .logc = -0x1.90c6d69483000p-3 },
143 .{ .invc = 0x1.35dce49ad36e2p+0, .logc = -0x1.87120a645c000p-3 },
144 .{ .invc = 0x1.34679984dd440p+0, .logc = -0x1.7d68fb4143000p-3 },
145 .{ .invc = 0x1.32f5cceffcb24p+0, .logc = -0x1.73cb83c627000p-3 },
146 .{ .invc = 0x1.3187775a10d49p+0, .logc = -0x1.6a39a9b376000p-3 },
147 .{ .invc = 0x1.301c8373e3990p+0, .logc = -0x1.60b3154b7a000p-3 },
148 .{ .invc = 0x1.2eb4ebb95f841p+0, .logc = -0x1.5737d76243000p-3 },
149 .{ .invc = 0x1.2d50a0219a9d1p+0, .logc = -0x1.4dc7b8fc23000p-3 },
150 .{ .invc = 0x1.2bef9a8b7fd2ap+0, .logc = -0x1.4462c51d20000p-3 },
151 .{ .invc = 0x1.2a91c7a0c1babp+0, .logc = -0x1.3b08abc830000p-3 },
152 .{ .invc = 0x1.293726014b530p+0, .logc = -0x1.31b996b490000p-3 },
153 .{ .invc = 0x1.27dfa5757a1f5p+0, .logc = -0x1.2875490a44000p-3 },
154 .{ .invc = 0x1.268b39b1d3bbfp+0, .logc = -0x1.1f3b9f879a000p-3 },
155 .{ .invc = 0x1.2539d838ff5bdp+0, .logc = -0x1.160c8252ca000p-3 },
156 .{ .invc = 0x1.23eb7aac9083bp+0, .logc = -0x1.0ce7f57f72000p-3 },
157 .{ .invc = 0x1.22a012ba940b6p+0, .logc = -0x1.03cdc49fea000p-3 },
158 .{ .invc = 0x1.2157996cc4132p+0, .logc = -0x1.f57bdbc4b8000p-4 },
159 .{ .invc = 0x1.201201dd2fc9bp+0, .logc = -0x1.e370896404000p-4 },
160 .{ .invc = 0x1.1ecf4494d480bp+0, .logc = -0x1.d17983ef94000p-4 },
161 .{ .invc = 0x1.1d8f5528f6569p+0, .logc = -0x1.bf9674ed8a000p-4 },
162 .{ .invc = 0x1.1c52311577e7cp+0, .logc = -0x1.adc79202f6000p-4 },
163 .{ .invc = 0x1.1b17c74cb26e9p+0, .logc = -0x1.9c0c3e7288000p-4 },
164 .{ .invc = 0x1.19e010c2c1ab6p+0, .logc = -0x1.8a646b372c000p-4 },
165 .{ .invc = 0x1.18ab07bb670bdp+0, .logc = -0x1.78d01b3ac0000p-4 },
166 .{ .invc = 0x1.1778a25efbcb6p+0, .logc = -0x1.674f145380000p-4 },
167 .{ .invc = 0x1.1648d354c31dap+0, .logc = -0x1.55e0e6d878000p-4 },
168 .{ .invc = 0x1.151b990275fddp+0, .logc = -0x1.4485cdea1e000p-4 },
169 .{ .invc = 0x1.13f0ea432d24cp+0, .logc = -0x1.333d94d6aa000p-4 },
170 .{ .invc = 0x1.12c8b7210f9dap+0, .logc = -0x1.22079f8c56000p-4 },
171 .{ .invc = 0x1.11a3028ecb531p+0, .logc = -0x1.10e4698622000p-4 },
172 .{ .invc = 0x1.107fbda8434afp+0, .logc = -0x1.ffa6c6ad20000p-5 },
173 .{ .invc = 0x1.0f5ee0f4e6bb3p+0, .logc = -0x1.dda8d4a774000p-5 },
174 .{ .invc = 0x1.0e4065d2a9fcep+0, .logc = -0x1.bbcece4850000p-5 },
175 .{ .invc = 0x1.0d244632ca521p+0, .logc = -0x1.9a1894012c000p-5 },
176 .{ .invc = 0x1.0c0a77ce2981ap+0, .logc = -0x1.788583302c000p-5 },
177 .{ .invc = 0x1.0af2f83c636d1p+0, .logc = -0x1.5715e67d68000p-5 },
178 .{ .invc = 0x1.09ddb98a01339p+0, .logc = -0x1.35c8a49658000p-5 },
179 .{ .invc = 0x1.08cabaf52e7dfp+0, .logc = -0x1.149e364154000p-5 },
180 .{ .invc = 0x1.07b9f2f4e28fbp+0, .logc = -0x1.e72c082eb8000p-6 },
181 .{ .invc = 0x1.06ab58c358f19p+0, .logc = -0x1.a55f152528000p-6 },
182 .{ .invc = 0x1.059eea5ecf92cp+0, .logc = -0x1.63d62cf818000p-6 },
183 .{ .invc = 0x1.04949cdd12c90p+0, .logc = -0x1.228fb8caa0000p-6 },
184 .{ .invc = 0x1.038c6c6f0ada9p+0, .logc = -0x1.c317b20f90000p-7 },
185 .{ .invc = 0x1.02865137932a9p+0, .logc = -0x1.419355daa0000p-7 },
186 .{ .invc = 0x1.0182427ea7348p+0, .logc = -0x1.81203c2ec0000p-8 },
187 .{ .invc = 0x1.008040614b195p+0, .logc = -0x1.0040979240000p-9 },
188 .{ .invc = 0x1.fe01ff726fa1ap-1, .logc = 0x1.feff384900000p-9 },
189 .{ .invc = 0x1.fa11cc261ea74p-1, .logc = 0x1.7dc41353d0000p-7 },
190 .{ .invc = 0x1.f6310b081992ep-1, .logc = 0x1.3cea3c4c28000p-6 },
191 .{ .invc = 0x1.f25f63ceeadcdp-1, .logc = 0x1.b9fc114890000p-6 },
192 .{ .invc = 0x1.ee9c8039113e7p-1, .logc = 0x1.1b0d8ce110000p-5 },
193 .{ .invc = 0x1.eae8078cbb1abp-1, .logc = 0x1.58a5bd001c000p-5 },
194 .{ .invc = 0x1.e741aa29d0c9bp-1, .logc = 0x1.95c8340d88000p-5 },
195 .{ .invc = 0x1.e3a91830a99b5p-1, .logc = 0x1.d276aef578000p-5 },
196 .{ .invc = 0x1.e01e009609a56p-1, .logc = 0x1.07598e598c000p-4 },
197 .{ .invc = 0x1.dca01e577bb98p-1, .logc = 0x1.253f5e30d2000p-4 },
198 .{ .invc = 0x1.d92f20b7c9103p-1, .logc = 0x1.42edd8b380000p-4 },
199 .{ .invc = 0x1.d5cac66fb5ccep-1, .logc = 0x1.606598757c000p-4 },
200 .{ .invc = 0x1.d272caa5ede9dp-1, .logc = 0x1.7da76356a0000p-4 },
201 .{ .invc = 0x1.cf26e3e6b2ccdp-1, .logc = 0x1.9ab434e1c6000p-4 },
202 .{ .invc = 0x1.cbe6da2a77902p-1, .logc = 0x1.b78c7bb0d6000p-4 },
203 .{ .invc = 0x1.c8b266d37086dp-1, .logc = 0x1.d431332e72000p-4 },
204 .{ .invc = 0x1.c5894bd5d5804p-1, .logc = 0x1.f0a3171de6000p-4 },
205 .{ .invc = 0x1.c26b533bb9f8cp-1, .logc = 0x1.067152b914000p-3 },
206 .{ .invc = 0x1.bf583eeece73fp-1, .logc = 0x1.147858292b000p-3 },
207 .{ .invc = 0x1.bc4fd75db96c1p-1, .logc = 0x1.2266ecdca3000p-3 },
208 .{ .invc = 0x1.b951e0c864a28p-1, .logc = 0x1.303d7a6c55000p-3 },
209 .{ .invc = 0x1.b65e2c5ef3e2cp-1, .logc = 0x1.3dfc33c331000p-3 },
210 .{ .invc = 0x1.b374867c9888bp-1, .logc = 0x1.4ba366b7a8000p-3 },
211 .{ .invc = 0x1.b094b211d304ap-1, .logc = 0x1.5933928d1f000p-3 },
212 .{ .invc = 0x1.adbe885f2ef7ep-1, .logc = 0x1.66acd2418f000p-3 },
213 .{ .invc = 0x1.aaf1d31603da2p-1, .logc = 0x1.740f8ec669000p-3 },
214 .{ .invc = 0x1.a82e63fd358a7p-1, .logc = 0x1.815c0f51af000p-3 },
215 .{ .invc = 0x1.a5740ef09738bp-1, .logc = 0x1.8e92954f68000p-3 },
216 .{ .invc = 0x1.a2c2a90ab4b27p-1, .logc = 0x1.9bb3602f84000p-3 },
217 .{ .invc = 0x1.a01a01393f2d1p-1, .logc = 0x1.a8bed1c2c0000p-3 },
218 .{ .invc = 0x1.9d79f24db3c1bp-1, .logc = 0x1.b5b515c01d000p-3 },
219 .{ .invc = 0x1.9ae2505c7b190p-1, .logc = 0x1.c2967ccbcc000p-3 },
220 .{ .invc = 0x1.9852ef297ce2fp-1, .logc = 0x1.cf635d5486000p-3 },
221 .{ .invc = 0x1.95cbaeea44b75p-1, .logc = 0x1.dc1bd3446c000p-3 },
222 .{ .invc = 0x1.934c69de74838p-1, .logc = 0x1.e8c01b8cfe000p-3 },
223 .{ .invc = 0x1.90d4f2f6752e6p-1, .logc = 0x1.f5509c0179000p-3 },
224 .{ .invc = 0x1.8e6528effd79dp-1, .logc = 0x1.00e6c121fb800p-2 },
225 .{ .invc = 0x1.8bfce9fcc007cp-1, .logc = 0x1.071b80e93d000p-2 },
226 .{ .invc = 0x1.899c0dabec30ep-1, .logc = 0x1.0d46b9e867000p-2 },
227 .{ .invc = 0x1.87427aa2317fbp-1, .logc = 0x1.13687334bd000p-2 },
228 .{ .invc = 0x1.84f00acb39a08p-1, .logc = 0x1.1980d67234800p-2 },
229 .{ .invc = 0x1.82a49e8653e55p-1, .logc = 0x1.1f8ffe0cc8000p-2 },
230 .{ .invc = 0x1.8060195f40260p-1, .logc = 0x1.2595fd7636800p-2 },
231 .{ .invc = 0x1.7e22563e0a329p-1, .logc = 0x1.2b9300914a800p-2 },
232 .{ .invc = 0x1.7beb377dcb5adp-1, .logc = 0x1.3187210436000p-2 },
233 .{ .invc = 0x1.79baa679725c2p-1, .logc = 0x1.377266dec1800p-2 },
234 .{ .invc = 0x1.77907f2170657p-1, .logc = 0x1.3d54ffbaf3000p-2 },
235 .{ .invc = 0x1.756cadbd6130cp-1, .logc = 0x1.432eee32fe000p-2 },
236 };
237
238 const tab2 = [128]struct { chi: f64, clo: f64 }{
239 .{ .chi = 0x1.61000014fb66bp-1, .clo = 0x1.e026c91425b3cp-56 },
240 .{ .chi = 0x1.63000034db495p-1, .clo = 0x1.dbfea48005d41p-55 },
241 .{ .chi = 0x1.650000d94d478p-1, .clo = 0x1.e7fa786d6a5b7p-55 },
242 .{ .chi = 0x1.67000074e6fadp-1, .clo = 0x1.1fcea6b54254cp-57 },
243 .{ .chi = 0x1.68ffffedf0faep-1, .clo = -0x1.c7e274c590efdp-56 },
244 .{ .chi = 0x1.6b0000763c5bcp-1, .clo = -0x1.ac16848dcda01p-55 },
245 .{ .chi = 0x1.6d0001e5cc1f6p-1, .clo = 0x1.33f1c9d499311p-55 },
246 .{ .chi = 0x1.6efffeb05f63ep-1, .clo = -0x1.e80041ae22d53p-56 },
247 .{ .chi = 0x1.710000e86978p-1, .clo = 0x1.bff6671097952p-56 },
248 .{ .chi = 0x1.72ffffc67e912p-1, .clo = 0x1.c00e226bd8724p-55 },
249 .{ .chi = 0x1.74fffdf81116ap-1, .clo = -0x1.e02916ef101d2p-57 },
250 .{ .chi = 0x1.770000f679c9p-1, .clo = -0x1.7fc71cd549c74p-57 },
251 .{ .chi = 0x1.78ffffa7ec835p-1, .clo = 0x1.1bec19ef50483p-55 },
252 .{ .chi = 0x1.7affffe20c2e6p-1, .clo = -0x1.07e1729cc6465p-56 },
253 .{ .chi = 0x1.7cfffed3fc9p-1, .clo = -0x1.08072087b8b1cp-55 },
254 .{ .chi = 0x1.7efffe9261a76p-1, .clo = 0x1.dc0286d9df9aep-55 },
255 .{ .chi = 0x1.81000049ca3e8p-1, .clo = 0x1.97fd251e54c33p-55 },
256 .{ .chi = 0x1.8300017932c8fp-1, .clo = -0x1.afee9b630f381p-55 },
257 .{ .chi = 0x1.850000633739cp-1, .clo = 0x1.9bfbf6b6535bcp-55 },
258 .{ .chi = 0x1.87000204289c6p-1, .clo = -0x1.bbf65f3117b75p-55 },
259 .{ .chi = 0x1.88fffebf57904p-1, .clo = -0x1.9006ea23dcb57p-55 },
260 .{ .chi = 0x1.8b00022bc04dfp-1, .clo = -0x1.d00df38e04b0ap-56 },
261 .{ .chi = 0x1.8cfffe50c1b8ap-1, .clo = -0x1.8007146ff9f05p-55 },
262 .{ .chi = 0x1.8effffc918e43p-1, .clo = 0x1.3817bd07a7038p-55 },
263 .{ .chi = 0x1.910001efa5fc7p-1, .clo = 0x1.93e9176dfb403p-55 },
264 .{ .chi = 0x1.9300013467bb9p-1, .clo = 0x1.f804e4b980276p-56 },
265 .{ .chi = 0x1.94fffe6ee076fp-1, .clo = -0x1.f7ef0d9ff622ep-55 },
266 .{ .chi = 0x1.96fffde3c12d1p-1, .clo = -0x1.082aa962638bap-56 },
267 .{ .chi = 0x1.98ffff4458a0dp-1, .clo = -0x1.7801b9164a8efp-55 },
268 .{ .chi = 0x1.9afffdd982e3ep-1, .clo = -0x1.740e08a5a9337p-55 },
269 .{ .chi = 0x1.9cfffed49fb66p-1, .clo = 0x1.fce08c19bep-60 },
270 .{ .chi = 0x1.9f00020f19c51p-1, .clo = -0x1.a3faa27885b0ap-55 },
271 .{ .chi = 0x1.a10001145b006p-1, .clo = 0x1.4ff489958da56p-56 },
272 .{ .chi = 0x1.a300007bbf6fap-1, .clo = 0x1.cbeab8a2b6d18p-55 },
273 .{ .chi = 0x1.a500010971d79p-1, .clo = 0x1.8fecadd78793p-55 },
274 .{ .chi = 0x1.a70001df52e48p-1, .clo = -0x1.f41763dd8abdbp-55 },
275 .{ .chi = 0x1.a90001c593352p-1, .clo = -0x1.ebf0284c27612p-55 },
276 .{ .chi = 0x1.ab0002a4f3e4bp-1, .clo = -0x1.9fd043cff3f5fp-57 },
277 .{ .chi = 0x1.acfffd7ae1ed1p-1, .clo = -0x1.23ee7129070b4p-55 },
278 .{ .chi = 0x1.aefffee510478p-1, .clo = 0x1.a063ee00edea3p-57 },
279 .{ .chi = 0x1.b0fffdb650d5bp-1, .clo = 0x1.a06c8381f0ab9p-58 },
280 .{ .chi = 0x1.b2ffffeaaca57p-1, .clo = -0x1.9011e74233c1dp-56 },
281 .{ .chi = 0x1.b4fffd995badcp-1, .clo = -0x1.9ff1068862a9fp-56 },
282 .{ .chi = 0x1.b7000249e659cp-1, .clo = 0x1.aff45d0864f3ep-55 },
283 .{ .chi = 0x1.b8ffff987164p-1, .clo = 0x1.cfe7796c2c3f9p-56 },
284 .{ .chi = 0x1.bafffd204cb4fp-1, .clo = -0x1.3ff27eef22bc4p-57 },
285 .{ .chi = 0x1.bcfffd2415c45p-1, .clo = -0x1.cffb7ee3bea21p-57 },
286 .{ .chi = 0x1.beffff86309dfp-1, .clo = -0x1.14103972e0b5cp-55 },
287 .{ .chi = 0x1.c0fffe1b57653p-1, .clo = 0x1.bc16494b76a19p-55 },
288 .{ .chi = 0x1.c2ffff1fa57e3p-1, .clo = -0x1.4feef8d30c6edp-57 },
289 .{ .chi = 0x1.c4fffdcbfe424p-1, .clo = -0x1.43f68bcec4775p-55 },
290 .{ .chi = 0x1.c6fffed54b9f7p-1, .clo = 0x1.47ea3f053e0ecp-55 },
291 .{ .chi = 0x1.c8fffeb998fd5p-1, .clo = 0x1.383068df992f1p-56 },
292 .{ .chi = 0x1.cb0002125219ap-1, .clo = -0x1.8fd8e64180e04p-57 },
293 .{ .chi = 0x1.ccfffdd94469cp-1, .clo = 0x1.e7ebe1cc7ea72p-55 },
294 .{ .chi = 0x1.cefffeafdc476p-1, .clo = 0x1.ebe39ad9f88fep-55 },
295 .{ .chi = 0x1.d1000169af82bp-1, .clo = 0x1.57d91a8b95a71p-56 },
296 .{ .chi = 0x1.d30000d0ff71dp-1, .clo = 0x1.9c1906970c7dap-55 },
297 .{ .chi = 0x1.d4fffea790fc4p-1, .clo = -0x1.80e37c558fe0cp-58 },
298 .{ .chi = 0x1.d70002edc87e5p-1, .clo = -0x1.f80d64dc10f44p-56 },
299 .{ .chi = 0x1.d900021dc82aap-1, .clo = -0x1.47c8f94fd5c5cp-56 },
300 .{ .chi = 0x1.dafffd86b0283p-1, .clo = 0x1.c7f1dc521617ep-55 },
301 .{ .chi = 0x1.dd000296c4739p-1, .clo = 0x1.8019eb2ffb153p-55 },
302 .{ .chi = 0x1.defffe54490f5p-1, .clo = 0x1.e00d2c652cc89p-57 },
303 .{ .chi = 0x1.e0fffcdabf694p-1, .clo = -0x1.f8340202d69d2p-56 },
304 .{ .chi = 0x1.e2fffdb52c8ddp-1, .clo = 0x1.b00c1ca1b0864p-56 },
305 .{ .chi = 0x1.e4ffff24216efp-1, .clo = 0x1.2ffa8b094ab51p-56 },
306 .{ .chi = 0x1.e6fffe88a5e11p-1, .clo = -0x1.7f673b1efbe59p-58 },
307 .{ .chi = 0x1.e9000119eff0dp-1, .clo = -0x1.4808d5e0bc801p-55 },
308 .{ .chi = 0x1.eafffdfa51744p-1, .clo = 0x1.80006d54320b5p-56 },
309 .{ .chi = 0x1.ed0001a127fa1p-1, .clo = -0x1.002f860565c92p-58 },
310 .{ .chi = 0x1.ef00007babcc4p-1, .clo = -0x1.540445d35e611p-55 },
311 .{ .chi = 0x1.f0ffff57a8d02p-1, .clo = -0x1.ffb3139ef9105p-59 },
312 .{ .chi = 0x1.f30001ee58ac7p-1, .clo = 0x1.a81acf2731155p-55 },
313 .{ .chi = 0x1.f4ffff5823494p-1, .clo = 0x1.a3f41d4d7c743p-55 },
314 .{ .chi = 0x1.f6ffffca94c6bp-1, .clo = -0x1.202f41c987875p-57 },
315 .{ .chi = 0x1.f8fffe1f9c441p-1, .clo = 0x1.77dd1f477e74bp-56 },
316 .{ .chi = 0x1.fafffd2e0e37ep-1, .clo = -0x1.f01199a7ca331p-57 },
317 .{ .chi = 0x1.fd0001c77e49ep-1, .clo = 0x1.181ee4bceacb1p-56 },
318 .{ .chi = 0x1.feffff7e0c331p-1, .clo = -0x1.e05370170875ap-57 },
319 .{ .chi = 0x1.00ffff465606ep+0, .clo = -0x1.a7ead491c0adap-55 },
320 .{ .chi = 0x1.02ffff3867a58p+0, .clo = -0x1.77f69c3fcb2ep-54 },
321 .{ .chi = 0x1.04ffffdfc0d17p+0, .clo = 0x1.7bffe34cb945bp-54 },
322 .{ .chi = 0x1.0700003cd4d82p+0, .clo = 0x1.20083c0e456cbp-55 },
323 .{ .chi = 0x1.08ffff9f2cbe8p+0, .clo = -0x1.dffdfbe37751ap-57 },
324 .{ .chi = 0x1.0b000010cda65p+0, .clo = -0x1.13f7faee626ebp-54 },
325 .{ .chi = 0x1.0d00001a4d338p+0, .clo = 0x1.07dfa79489ff7p-55 },
326 .{ .chi = 0x1.0effffadafdfdp+0, .clo = -0x1.7040570d66bcp-56 },
327 .{ .chi = 0x1.110000bbafd96p+0, .clo = 0x1.e80d4846d0b62p-55 },
328 .{ .chi = 0x1.12ffffae5f45dp+0, .clo = 0x1.dbffa64fd36efp-54 },
329 .{ .chi = 0x1.150000dd59ad9p+0, .clo = 0x1.a0077701250aep-54 },
330 .{ .chi = 0x1.170000f21559ap+0, .clo = 0x1.dfdf9e2e3deeep-55 },
331 .{ .chi = 0x1.18ffffc275426p+0, .clo = 0x1.10030dc3b7273p-54 },
332 .{ .chi = 0x1.1b000123d3c59p+0, .clo = 0x1.97f7980030188p-54 },
333 .{ .chi = 0x1.1cffff8299eb7p+0, .clo = -0x1.5f932ab9f8c67p-57 },
334 .{ .chi = 0x1.1effff48ad4p+0, .clo = 0x1.37fbf9da75bebp-54 },
335 .{ .chi = 0x1.210000c8b86a4p+0, .clo = 0x1.f806b91fd5b22p-54 },
336 .{ .chi = 0x1.2300003854303p+0, .clo = 0x1.3ffc2eb9fbf33p-54 },
337 .{ .chi = 0x1.24fffffbcf684p+0, .clo = 0x1.601e77e2e2e72p-56 },
338 .{ .chi = 0x1.26ffff52921d9p+0, .clo = 0x1.ffcbb767f0c61p-56 },
339 .{ .chi = 0x1.2900014933a3cp+0, .clo = -0x1.202ca3c02412bp-56 },
340 .{ .chi = 0x1.2b00014556313p+0, .clo = -0x1.2808233f21f02p-54 },
341 .{ .chi = 0x1.2cfffebfe523bp+0, .clo = -0x1.8ff7e384fdcf2p-55 },
342 .{ .chi = 0x1.2f0000bb8ad96p+0, .clo = -0x1.5ff51503041c5p-55 },
343 .{ .chi = 0x1.30ffffb7ae2afp+0, .clo = -0x1.10071885e289dp-55 },
344 .{ .chi = 0x1.32ffffeac5f7fp+0, .clo = -0x1.1ff5d3fb7b715p-54 },
345 .{ .chi = 0x1.350000ca66756p+0, .clo = 0x1.57f82228b82bdp-54 },
346 .{ .chi = 0x1.3700011fbf721p+0, .clo = 0x1.000bac40dd5ccp-55 },
347 .{ .chi = 0x1.38ffff9592fb9p+0, .clo = -0x1.43f9d2db2a751p-54 },
348 .{ .chi = 0x1.3b00004ddd242p+0, .clo = 0x1.57f6b707638e1p-55 },
349 .{ .chi = 0x1.3cffff5b2c957p+0, .clo = 0x1.a023a10bf1231p-56 },
350 .{ .chi = 0x1.3efffeab0b418p+0, .clo = 0x1.87f6d66b152bp-54 },
351 .{ .chi = 0x1.410001532aff4p+0, .clo = 0x1.7f8375f198524p-57 },
352 .{ .chi = 0x1.4300017478b29p+0, .clo = 0x1.301e672dc5143p-55 },
353 .{ .chi = 0x1.44fffe795b463p+0, .clo = 0x1.9ff69b8b2895ap-55 },
354 .{ .chi = 0x1.46fffe80475ep+0, .clo = -0x1.5c0b19bc2f254p-54 },
355 .{ .chi = 0x1.48fffef6fc1e7p+0, .clo = 0x1.b4009f23a2a72p-54 },
356 .{ .chi = 0x1.4afffe5bea704p+0, .clo = -0x1.4ffb7bf0d7d45p-54 },
357 .{ .chi = 0x1.4d000171027dep+0, .clo = -0x1.9c06471dc6a3dp-54 },
358 .{ .chi = 0x1.4f0000ff03ee2p+0, .clo = 0x1.77f890b85531cp-54 },
359 .{ .chi = 0x1.5100012dc4bd1p+0, .clo = 0x1.004657166a436p-57 },
360 .{ .chi = 0x1.530001605277ap+0, .clo = -0x1.6bfcece233209p-54 },
361 .{ .chi = 0x1.54fffecdb704cp+0, .clo = -0x1.902720505a1d7p-55 },
362 .{ .chi = 0x1.56fffef5f54a9p+0, .clo = 0x1.bbfe60ec96412p-54 },
363 .{ .chi = 0x1.5900017e61012p+0, .clo = 0x1.87ec581afef9p-55 },
364 .{ .chi = 0x1.5b00003c93e92p+0, .clo = -0x1.f41080abf0ccp-54 },
365 .{ .chi = 0x1.5d0001d4919bcp+0, .clo = -0x1.8812afb254729p-54 },
366 .{ .chi = 0x1.5efffe7b87a89p+0, .clo = -0x1.47eb780ed6904p-54 },
367 };
368
369 var ix: i64 = @bitCast(x);
370
371 const LO: i64 = @bitCast(@as(f64, 1.0 - 0x1p-4));
372 const HI: i64 = @bitCast(@as(f64, 1.0 + 0x1.09p-4));
373 if (LO <= ix and ix < HI) {
374 @branchHint(.unlikely);
375 if (ix == @as(i64, @bitCast(@as(f64, 1)))) {
376 @branchHint(.unlikely);
377 return 0;
110 }378 }
111379
112 // subnormal, scale x380 const r = x - 1;
113 k -= 54;381 const r2 = r * r;
114 x *= 0x1p54;382 const r3 = r * r2;
115 hx = @intCast(@as(u64, @bitCast(x)) >> 32);383
116 } else if (hx >= 0x7FF00000) {384 const y = r3 * (poly1[1] + r * poly1[2] + r2 * poly1[3] +
117 return x;385 r3 * (poly1[4] + r * poly1[5] + r2 * poly1[6] +
118 } else if (hx == 0x3FF00000 and ix << 32 == 0) {386 r3 * (poly1[7] + r * poly1[8] + r2 * poly1[9] + r3 * poly1[10])));
119 return 0;387
388 var w = r * 0x1p27;
389 const rhi = r + w - w;
390 const rlo = r - rhi;
391 w = rhi * rhi * poly1[0];
392 const hi = r + w;
393 const lo = r - hi + w + poly1[0] * rlo * (rhi + r);
394 return y + lo + hi;
120 }395 }
396 const top = @as(u64, @bitCast(ix)) >> 48;
397 if (top < 0x0010 or 0x7ff0 <= top) {
398 @branchHint(.unlikely);
121399
122 // x into [sqrt(2) / 2, sqrt(2)]400 if (ix << 1 == 0)
123 hx += 0x3FF00000 - 0x3FE6A09E;401 return if (common.want_float_exceptions) -1 / (x * x) else -std.math.inf(f64);
124 k += @as(i32, @intCast(hx >> 20)) - 0x3FF;
125 hx = (hx & 0x000FFFFF) + 0x3FE6A09E;
126 ix = (@as(u64, hx) << 32) | (ix & 0xFFFFFFFF);
127 x = @bitCast(ix);
128402
129 const f = x - 1.0;403 if (ix == @as(i64, @bitCast(std.math.inf(f64))))
130 const hfsq = 0.5 * f * f;404 return x;
131 const s = f / (2.0 + f);
132 const z = s * s;
133 const w = z * z;
134 const t1 = w * (Lg2 + w * (Lg4 + w * Lg6));
135 const t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));
136 const R = t2 + t1;
137 const dk: f64 = @floatFromInt(k);
138405
139 return s * (hfsq + R) + dk * ln2_lo - hfsq + f + dk * ln2_hi;406 if (top & 0x8000 != 0 or top & 0x7ff0 == 0x7ff0)
407 return if (common.want_float_exceptions) (x - x) / 0.0 else math.nan(f64);
408
409 ix = @as(i64, @bitCast(x * 0x1p52)) - (52 << 52);
410 }
411
412 const tmp: packed struct(i64) { unused: u45, i: u7, k: i12 } = @bitCast(ix - 0x3fe6000000000000);
413 const i = tmp.i;
414 const k = tmp.k;
415 const iz = ix - (@as(i64, tmp.k) << 52);
416 const invc = tab[i].invc;
417 const logc = tab[i].logc;
418 const z: f64 = @bitCast(iz);
419
420 // maybe use fma as musl does
421 const r = (z - tab2[i].chi - tab2[i].clo) * invc;
422
423 // https://github.com/ziglang/zig/issues/18614
424 const kd: f64 = @floatFromInt(k);
425 const w = kd * 0x1.62e42fefa3800p-1 + logc;
426 const hi = w + r;
427 const lo = w - hi + r + kd * 0x1.ef35793c76730p-45;
428
429 const r2 = r * r;
430
431 const y = lo + r2 * poly[0] + r * r2 * (poly[1] + r * poly[2] + r2 * (poly[3] + r * poly[4])) + hi;
432 return @bitCast(y);
140}433}
141434
142pub fn __logx(a: f80) callconv(.c) f80 {435pub fn __logx(a: f80) callconv(.c) f80 {
lib/compiler_rt/log10.zig+4-6
...@@ -13,8 +13,6 @@ const maxInt = std.math.maxInt;...@@ -13,8 +13,6 @@ const maxInt = std.math.maxInt;
13const arch = builtin.cpu.arch;13const arch = builtin.cpu.arch;
14const common = @import("common.zig");14const common = @import("common.zig");
1515
16pub const panic = common.panic;
17
18comptime {16comptime {
19 @export(&__log10h, .{ .name = "__log10h", .linkage = common.linkage, .visibility = common.visibility });17 @export(&__log10h, .{ .name = "__log10h", .linkage = common.linkage, .visibility = common.visibility });
20 @export(&log10f, .{ .name = "log10f", .linkage = common.linkage, .visibility = common.visibility });18 @export(&log10f, .{ .name = "log10f", .linkage = common.linkage, .visibility = common.visibility });
...@@ -51,11 +49,11 @@ pub fn log10f(x_: f32) callconv(.c) f32 {...@@ -51,11 +49,11 @@ pub fn log10f(x_: f32) callconv(.c) f32 {
51 if (ix < 0x00800000 or ix >> 31 != 0) {49 if (ix < 0x00800000 or ix >> 31 != 0) {
52 // log(+-0) = -inf50 // log(+-0) = -inf
53 if (ix << 1 == 0) {51 if (ix << 1 == 0) {
54 return -math.inf(f32);52 return if (common.want_float_exceptions) -1 / (x * x) else -std.math.inf(f64);
55 }53 }
56 // log(-#) = nan54 // log(-#) = nan
57 if (ix >> 31 != 0) {55 if (ix >> 31 != 0) {
58 return math.nan(f32);56 return if (common.want_float_exceptions) (x - x) / 0.0 else math.nan(f64);
59 }57 }
6058
61 k -= 25;59 k -= 25;
...@@ -113,11 +111,11 @@ pub fn log10(x_: f64) callconv(.c) f64 {...@@ -113,11 +111,11 @@ pub fn log10(x_: f64) callconv(.c) f64 {
113 if (hx < 0x00100000 or hx >> 31 != 0) {111 if (hx < 0x00100000 or hx >> 31 != 0) {
114 // log(+-0) = -inf112 // log(+-0) = -inf
115 if (ix << 1 == 0) {113 if (ix << 1 == 0) {
116 return -math.inf(f64);114 return if (common.want_float_exceptions) -1 / (x * x) else -std.math.inf(f64);
117 }115 }
118 // log(-#) = nan116 // log(-#) = nan
119 if (hx >> 31 != 0) {117 if (hx >> 31 != 0) {
120 return math.nan(f64);118 return if (common.want_float_exceptions) (x - x) / 0.0 else math.nan(f64);
121 }119 }
122120
123 // subnormal, scale x121 // subnormal, scale x
lib/compiler_rt/log2.zig+4-6
...@@ -13,8 +13,6 @@ const maxInt = std.math.maxInt;...@@ -13,8 +13,6 @@ const maxInt = std.math.maxInt;
13const arch = builtin.cpu.arch;13const arch = builtin.cpu.arch;
14const common = @import("common.zig");14const common = @import("common.zig");
1515
16pub const panic = common.panic;
17
18comptime {16comptime {
19 @export(&__log2h, .{ .name = "__log2h", .linkage = common.linkage, .visibility = common.visibility });17 @export(&__log2h, .{ .name = "__log2h", .linkage = common.linkage, .visibility = common.visibility });
20 @export(&log2f, .{ .name = "log2f", .linkage = common.linkage, .visibility = common.visibility });18 @export(&log2f, .{ .name = "log2f", .linkage = common.linkage, .visibility = common.visibility });
...@@ -49,11 +47,11 @@ pub fn log2f(x_: f32) callconv(.c) f32 {...@@ -49,11 +47,11 @@ pub fn log2f(x_: f32) callconv(.c) f32 {
49 if (ix < 0x00800000 or ix >> 31 != 0) {47 if (ix < 0x00800000 or ix >> 31 != 0) {
50 // log(+-0) = -inf48 // log(+-0) = -inf
51 if (ix << 1 == 0) {49 if (ix << 1 == 0) {
52 return -math.inf(f32);50 return if (common.want_float_exceptions) -1 / (x * x) else -std.math.inf(f64);
53 }51 }
54 // log(-#) = nan52 // log(-#) = nan
55 if (ix >> 31 != 0) {53 if (ix >> 31 != 0) {
56 return math.nan(f32);54 return if (common.want_float_exceptions) (x - x) / 0.0 else math.nan(f64);
57 }55 }
5856
59 k -= 25;57 k -= 25;
...@@ -107,11 +105,11 @@ pub fn log2(x_: f64) callconv(.c) f64 {...@@ -107,11 +105,11 @@ pub fn log2(x_: f64) callconv(.c) f64 {
107 if (hx < 0x00100000 or hx >> 31 != 0) {105 if (hx < 0x00100000 or hx >> 31 != 0) {
108 // log(+-0) = -inf106 // log(+-0) = -inf
109 if (ix << 1 == 0) {107 if (ix << 1 == 0) {
110 return -math.inf(f64);108 return if (common.want_float_exceptions) -1 / (x * x) else -std.math.inf(f64);
111 }109 }
112 // log(-#) = nan110 // log(-#) = nan
113 if (hx >> 31 != 0) {111 if (hx >> 31 != 0) {
114 return math.nan(f64);112 return if (common.want_float_exceptions) (x - x) / 0.0 else math.nan(f64);
115 }113 }
116114
117 // subnormal, scale x115 // subnormal, scale x