#include <stdio.h>
#include <math.h>
float cbrt_(float x) {
static const float T[7] = { 0.545253866f, 0.594603558f, 0.648419777f, 0.707106781f, 0.771105413f, 0.840896415f, 0.917004043f };
static const float C0[3][8] = {
{1.655867887f, 1.608728542f, 1.562931164f, 1.518437547f, 1.475210578f, 1.433214196f, 1.392413370f, 1.352774064f },
{1.314263213f, 1.276848690f, 1.240499287f, 1.205184680f, 1.170875412f, 1.137542861f, 1.105159224f, 1.073697486f },
{1.043131403f, 1.013435477f, 0.984584936f, 0.956555714f, 0.929324430f, 0.902868367f, 0.877165458f, 0.852194260f },
};
static const float C1[3][8] = {
{-0.792419094f, -0.705965155f, -0.628943451f, -0.560324915f, -0.499192748f, -0.444730180f, -0.396209547f, -0.352982577f },
{-0.628943451f, -0.560324915f, -0.499192748f, -0.444730180f, -0.396209547f, -0.352982577f, -0.314471726f, -0.280162457f },
{-0.499192748f, -0.444730180f, -0.396209547f, -0.352982577f, -0.314471726f, -0.280162457f, -0.249596374f, -0.222365090f },
};
if (x < 0.f) {
return -cbrt_(-x);
}
int e;
float f = frexpf(x, &e);
int e_div_3 = (e + 150) / 3 - 50;
int e_mod_3 = e - e_div_3 * 3;
int n = 3;
int m = 4;
for (int i = 0; i < 3; i++) {
if (f < T[n]) {
m >>= 1;
n -= m;
}
else {
m = (m + 1 >> 1);
n += m;
}
}
x = C0[e_mod_3][n] + C1[e_mod_3][n] * f;
f = ldexpf(f, e_mod_3);
x += (1.f / 3.f) * (x - f * (x * x) * (x * x));
return ldexpf(f * (x * x), e_div_3);
}
int main() {
float TABLE1[] = { 0.958102574f, 0.99999994f, 1.f };
float TABLE2[] = { .5f, 0.545253866f, 0.594603558f, 0.648419777f, 0.707106781f, 0.771105413f, 0.840896415f, 0.917004043f };
float TABLE3[] = { 0.125f, 0.25f, 0.5f, 1.f, 2.f, 4.f, 8.f, 16.f, 32.f, -1.f, -2.f, -4.f };
for (float x3 : TABLE3) {
for (float x2 : TABLE2) {
for (float x1 : TABLE1) {
float x = x1 * x2 * x3;
float y1 = cbrt_(x);
float y0 = cbrt(x);
printf("%e\n", (double)y1 / (double)y0 - 1.);
}
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgpmbG9hdCBjYnJ0XyhmbG9hdCB4KSB7CglzdGF0aWMgY29uc3QgZmxvYXQgVFs3XSA9IHsgMC41NDUyNTM4NjZmLCAwLjU5NDYwMzU1OGYsIDAuNjQ4NDE5Nzc3ZiwgMC43MDcxMDY3ODFmLCAwLjc3MTEwNTQxM2YsIDAuODQwODk2NDE1ZiwgMC45MTcwMDQwNDNmIH07CglzdGF0aWMgY29uc3QgZmxvYXQgQzBbM11bOF0gPSB7CgkJezEuNjU1ODY3ODg3ZiwgMS42MDg3Mjg1NDJmLCAxLjU2MjkzMTE2NGYsIDEuNTE4NDM3NTQ3ZiwgMS40NzUyMTA1NzhmLCAxLjQzMzIxNDE5NmYsIDEuMzkyNDEzMzcwZiwgMS4zNTI3NzQwNjRmIH0sCgkJezEuMzE0MjYzMjEzZiwgMS4yNzY4NDg2OTBmLCAxLjI0MDQ5OTI4N2YsIDEuMjA1MTg0NjgwZiwgMS4xNzA4NzU0MTJmLCAxLjEzNzU0Mjg2MWYsIDEuMTA1MTU5MjI0ZiwgMS4wNzM2OTc0ODZmIH0sCgkJezEuMDQzMTMxNDAzZiwgMS4wMTM0MzU0NzdmLCAwLjk4NDU4NDkzNmYsIDAuOTU2NTU1NzE0ZiwgMC45MjkzMjQ0MzBmLCAwLjkwMjg2ODM2N2YsIDAuODc3MTY1NDU4ZiwgMC44NTIxOTQyNjBmIH0sCgl9OwoJc3RhdGljIGNvbnN0IGZsb2F0IEMxWzNdWzhdID0gewoJCXstMC43OTI0MTkwOTRmLCAtMC43MDU5NjUxNTVmLCAtMC42Mjg5NDM0NTFmLCAtMC41NjAzMjQ5MTVmLCAtMC40OTkxOTI3NDhmLCAtMC40NDQ3MzAxODBmLCAtMC4zOTYyMDk1NDdmLCAtMC4zNTI5ODI1NzdmIH0sCgkJey0wLjYyODk0MzQ1MWYsIC0wLjU2MDMyNDkxNWYsIC0wLjQ5OTE5Mjc0OGYsIC0wLjQ0NDczMDE4MGYsIC0wLjM5NjIwOTU0N2YsIC0wLjM1Mjk4MjU3N2YsIC0wLjMxNDQ3MTcyNmYsIC0wLjI4MDE2MjQ1N2YgfSwKCQl7LTAuNDk5MTkyNzQ4ZiwgLTAuNDQ0NzMwMTgwZiwgLTAuMzk2MjA5NTQ3ZiwgLTAuMzUyOTgyNTc3ZiwgLTAuMzE0NDcxNzI2ZiwgLTAuMjgwMTYyNDU3ZiwgLTAuMjQ5NTk2Mzc0ZiwgLTAuMjIyMzY1MDkwZiB9LAoJfTsKCglpZiAoeCA8IDAuZikgewoJCXJldHVybiAtY2JydF8oLXgpOwoJfQoKCWludCBlOwoJZmxvYXQgZiA9IGZyZXhwZih4LCAmZSk7CglpbnQgZV9kaXZfMyA9IChlICsgMTUwKSAvIDMgLSA1MDsKCWludCBlX21vZF8zID0gZSAtIGVfZGl2XzMgKiAzOwoJaW50IG4gPSAzOwoJaW50IG0gPSA0OwoJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKCQlpZiAoZiA8IFRbbl0pIHsKCQkJbSA+Pj0gMTsKCQkJbiAtPSBtOwoJCX0KCQllbHNlIHsKCQkJbSA9IChtICsgMSA+PiAxKTsKCQkJbiArPSBtOwoJCX0KCX0KCXggPSBDMFtlX21vZF8zXVtuXSArIEMxW2VfbW9kXzNdW25dICogZjsKCWYgPSBsZGV4cGYoZiwgZV9tb2RfMyk7Cgl4ICs9ICgxLmYgLyAzLmYpICogKHggLSBmICogKHggKiB4KSAqICh4ICogeCkpOwoJcmV0dXJuIGxkZXhwZihmICogKHggKiB4KSwgZV9kaXZfMyk7Cn0KCmludCBtYWluKCkgewoJZmxvYXQgVEFCTEUxW10gPSB7IDAuOTU4MTAyNTc0ZiwgMC45OTk5OTk5NGYsIDEuZiB9OwoJZmxvYXQgVEFCTEUyW10gPSB7IC41ZiwgMC41NDUyNTM4NjZmLCAwLjU5NDYwMzU1OGYsIDAuNjQ4NDE5Nzc3ZiwgMC43MDcxMDY3ODFmLCAwLjc3MTEwNTQxM2YsIDAuODQwODk2NDE1ZiwgMC45MTcwMDQwNDNmIH07CglmbG9hdCBUQUJMRTNbXSA9IHsgMC4xMjVmLCAwLjI1ZiwgMC41ZiwgMS5mLCAyLmYsIDQuZiwgOC5mLCAxNi5mLCAzMi5mLCAtMS5mLCAtMi5mLCAtNC5mIH07Cglmb3IgKGZsb2F0IHgzIDogVEFCTEUzKSB7CgkJZm9yIChmbG9hdCB4MiA6IFRBQkxFMikgewoJCQlmb3IgKGZsb2F0IHgxIDogVEFCTEUxKSB7CgkJCQlmbG9hdCB4ID0geDEgKiB4MiAqIHgzOwoJCQkJZmxvYXQgeTEgPSBjYnJ0Xyh4KTsKCQkJCWZsb2F0IHkwID0gY2JydCh4KTsKCQkJCXByaW50ZigiJWVcbiIsIChkb3VibGUpeTEgLyAoZG91YmxlKXkwIC0gMS4pOwoJCQl9CgkJfQoJfQoJcmV0dXJuIDA7Cn0K