fn cbrt32(x: f32) f32
fn cbrt32(x: f32) f32 { const B1: u32 = 709958130; // (127 - 127.0 / 3 - 0.03306235651) * 2^23 const B2: u32 = 642849266; // (127 - 127.0 / 3 - 24 / 3 - 0.03306235651) * 2^23 var u = @as(u32, @bitCast(x)); var hx = u & 0x7FFFFFFF; // cbrt(nan, inf) = itself if (hx >= 0x7F800000) { return x + x; } // cbrt to ~5bits if (hx < 0x00800000) { // cbrt(+-0) = itself if (hx == 0) { return x; } u = @as(u32, @bitCast(x * 0x1.0p24)); hx = u & 0x7FFFFFFF; hx = hx / 3 + B2; } else { hx = hx / 3 + B1; } u &= 0x80000000; u |= hx; // first step newton to 16 bits var t: f64 = @as(f32, @bitCast(u)); var r: f64 = t * t * t; t = t * (@as(f64, x) + x + r) / (x + r + r); // second step newton to 47 bits r = t * t * t; t = t * (@as(f64, x) + x + r) / (x + r + r); return @as(f32, @floatCast(t)); }