#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)] pubfn powf(x: f32, y: f32) -> f32 { letmut z: f32; letmut ax: f32; let z_h: f32; let z_l: f32; letmut p_h: f32; letmut p_l: f32; let y1: f32; letmut t1: f32; let t2: f32; letmut r: f32; let s: f32; letmut sn: f32; letmut t: f32; letmut u: f32; letmut v: f32; letmut w: f32; let i: i32; letmut j: i32; letmut k: i32; letmut yisint: i32; letmut n: i32; let hx: i32; let hy: i32; letmut ix: i32; let iy: i32; letmut is: i32;
hx = x.to_bits() as i32;
hy = y.to_bits() as i32;
ix = hx & 0x7fffffff;
iy = hy & 0x7fffffff;
/* x**0 = 1, even if x is NaN */ if iy == 0 { return1.0;
}
/* 1**y = 1, even if y is NaN */ if hx == 0x3f800000 { return1.0;
}
/* NaN if either arg is NaN */ if ix > 0x7f800000 || iy > 0x7f800000 { return x + y;
}
/* determine if y is an odd int when x < 0 *yisint=0...yisnotaninteger *yisint=1...yisanoddint *yisint=2...yisanevenint
*/
yisint = 0; if hx < 0 { if iy >= 0x4b800000 {
yisint = 2; /* even integer y */
} elseif iy >= 0x3f800000 {
k = (iy >> 23) - 0x7f; /* exponent */
j = iy >> (23 - k); if (j << (23 - k)) == iy {
yisint = 2 - (j & 1);
}
}
}
/* special value of y */ if iy == 0x7f800000 { /* y is +-inf */ if ix == 0x3f800000 { /* (-1)**+-inf is 1 */ return1.0;
} elseif ix > 0x3f800000 { /* (|x|>1)**+-inf = inf,0 */ returnif hy >= 0 { y } else { 0.0 };
} else { /* (|x|<1)**+-inf = 0,inf */ returnif hy >= 0 { 0.0 } else { -y };
}
} if iy == 0x3f800000 { /* y is +-1 */ returnif hy >= 0 { x } else { 1.0 / x };
}
if hy == 0x40000000 { /* y is 2 */ return x * x;
}
if hy == 0x3f000000 /* y is 0.5 */
&& hx >= 0
{ /* x >= +0 */ return sqrtf(x);
}
ax = fabsf(x); /* special value of x */ if ix == 0x7f800000 || ix == 0 || ix == 0x3f800000 { /* x is +-0,+-inf,+-1 */
z = ax; if hy < 0 { /* z = (1/|x|) */
z = 1.0 / z;
}
if hx < 0 { if ((ix - 0x3f800000) | yisint) == 0 {
z = (z - z) / (z - z); /* (-1)**non-int is NaN */
} elseif yisint == 1 {
z = -z; /* (x<0)**odd = -(|x|**odd) */
}
} return z;
}
sn = 1.0; /* sign of result */ if hx < 0 { if yisint == 0 { /* (x<0)**(non-int) is NaN */ return (x - x) / (x - x);
}
if yisint == 1 { /* (x<0)**(odd int) */
sn = -1.0;
}
}
/* |y| is HUGE */ if iy > 0x4d000000 { /* if |y| > 2**27 */ /* over/underflow if x is not close to one */ if ix < 0x3f7ffff8 { returnif hy < 0 {
sn * HUGE * HUGE
} else {
sn * TINY * TINY
};
}
if ix > 0x3f800007 { returnif hy > 0 {
sn * HUGE * HUGE
} else {
sn * TINY * TINY
};
}
/* now |1-x| is TINY <= 2**-20, suffice to compute
log(x) by x-x^2/2+x^3/3-x^4/4 */
t = ax - 1.; /* t has 20 trailing zeros */
w = (t * t) * (0.5 - t * (0.333333333333 - t * 0.25));
u = IVLN2_H * t; /* IVLN2_H has 16 sig. bits */
v = t * IVLN2_L - w * IVLN2;
t1 = u + v;
is = t1.to_bits() as i32;
t1 = f32::from_bits(is as u32 & 0xfffff000);
t2 = v - (t1 - u);
} else { letmut s2: f32; letmut s_h: f32; let s_l: f32; letmut t_h: f32; letmut t_l: f32;
n = 0; /* take care subnormal number */ if ix < 0x00800000 {
ax *= TWO24;
n -= 24;
ix = ax.to_bits() as i32;
}
n += ((ix) >> 23) - 0x7f;
j = ix & 0x007fffff; /* determine interval */
ix = j | 0x3f800000; /* normalize ix */ if j <= 0x1cc471 { /* |x|<sqrt(3/2) */
k = 0;
} elseif j < 0x5db3d7 { /* |x|<sqrt(3) */
k = 1;
} else {
k = 0;
n += 1;
ix -= 0x00800000;
}
ax = f32::from_bits(ix as u32);
/* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
u = ax - i!(BP, k as usize); /* bp[0]=1.0, bp[1]=1.5 */
v = 1.0 / (ax + i!(BP, k as usize));
s = u * v;
s_h = s;
is = s_h.to_bits() as i32;
s_h = f32::from_bits(is as u32 & 0xfffff000); /* t_h=ax+bp[k] High */
is = (((ix as u32 >> 1) & 0xfffff000) | 0x20000000) as i32;
t_h = f32::from_bits(is as u32 + 0x00400000 + ((k as u32) << 21));
t_l = ax - (t_h - i!(BP, k as usize));
s_l = v * ((u - s_h * t_h) - s_h * t_l); /* compute log(ax) */
s2 = s * s;
r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));
r += s_l * (s_h + s);
s2 = s_h * s_h;
t_h = 3.0 + s2 + r;
is = t_h.to_bits() as i32;
t_h = f32::from_bits(is as u32 & 0xfffff000);
t_l = r - ((t_h - 3.0) - s2); /* u+v = s*(1+...) */
u = s_h * t_h;
v = s_l * t_h + t_l * s; /* 2/(3log2)*(s+...) */
p_h = u + v;
is = p_h.to_bits() as i32;
p_h = f32::from_bits(is as u32 & 0xfffff000);
p_l = v - (p_h - u);
z_h = CP_H * p_h; /* cp_h+cp_l = 2/(3*log2) */
z_l = CP_L * p_h + p_l * CP + i!(DP_L, k as usize); /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
t = n as f32;
t1 = ((z_h + z_l) + i!(DP_H, k as usize)) + t;
is = t1.to_bits() as i32;
t1 = f32::from_bits(is as u32 & 0xfffff000);
t2 = z_l - (((t1 - t) - i!(DP_H, k as usize)) - z_h);
};
/* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
is = y.to_bits() as i32;
y1 = f32::from_bits(is as u32 & 0xfffff000);
p_l = (y - y1) * t1 + y * t2;
p_h = y1 * t1;
z = p_l + p_h;
j = z.to_bits() as i32; if j > 0x43000000 { /* if z > 128 */ return sn * HUGE * HUGE; /* overflow */
} elseif j == 0x43000000 { /* if z == 128 */ if p_l + OVT > z - p_h { return sn * HUGE * HUGE; /* overflow */
}
} elseif (j & 0x7fffffff) > 0x43160000 { /* z < -150 */ // FIXME: check should be (uint32_t)j > 0xc3160000 return sn * TINY * TINY; /* underflow */
} elseif j as u32 == 0xc3160000 /* z == -150 */
&& p_l <= z - p_h
{ return sn * TINY * TINY; /* underflow */
}
/* *compute2**(p_h+p_l)
*/
i = j & 0x7fffffff;
k = (i >> 23) - 0x7f;
n = 0; if i > 0x3f000000 { /* if |z| > 0.5, set n = [z+0.5] */
n = j + (0x00800000 >> (k + 1));
k = ((n & 0x7fffffff) >> 23) - 0x7f; /* new k for n */
t = f32::from_bits(n as u32 & !(0x007fffff >> k));
n = ((n & 0x007fffff) | 0x00800000) >> (23 - k); if j < 0 {
n = -n;
}
p_h -= t;
}
t = p_l + p_h;
is = t.to_bits() as i32;
t = f32::from_bits(is as u32 & 0xffff8000);
u = t * LG2_H;
v = (p_l - (t - p_h)) * LG2 + t * LG2_L;
z = u + v;
w = v - (z - u);
t = z * z;
t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));
r = (z * t1) / (t1 - 2.0) - (w + z * w);
z = 1.0 - (r - z);
j = z.to_bits() as i32;
j += n << 23; if (j >> 23) <= 0 { /* subnormal output */
z = scalbnf(z, n);
} else {
z = f32::from_bits(j as u32);
}
sn * z
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-18)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.