fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. float cbrt_(float x) {
  5. static const float T[7] = { 0.545253866f, 0.594603558f, 0.648419777f, 0.707106781f, 0.771105413f, 0.840896415f, 0.917004043f };
  6. static const float C0[3][8] = {
  7. {1.655867887f, 1.608728542f, 1.562931164f, 1.518437547f, 1.475210578f, 1.433214196f, 1.392413370f, 1.352774064f },
  8. {1.314263213f, 1.276848690f, 1.240499287f, 1.205184680f, 1.170875412f, 1.137542861f, 1.105159224f, 1.073697486f },
  9. {1.043131403f, 1.013435477f, 0.984584936f, 0.956555714f, 0.929324430f, 0.902868367f, 0.877165458f, 0.852194260f },
  10. };
  11. static const float C1[3][8] = {
  12. {-0.792419094f, -0.705965155f, -0.628943451f, -0.560324915f, -0.499192748f, -0.444730180f, -0.396209547f, -0.352982577f },
  13. {-0.628943451f, -0.560324915f, -0.499192748f, -0.444730180f, -0.396209547f, -0.352982577f, -0.314471726f, -0.280162457f },
  14. {-0.499192748f, -0.444730180f, -0.396209547f, -0.352982577f, -0.314471726f, -0.280162457f, -0.249596374f, -0.222365090f },
  15. };
  16.  
  17. if (x < 0.f) {
  18. return -cbrt_(-x);
  19. }
  20.  
  21. int e;
  22. float f = frexpf(x, &e);
  23. int e_div_3 = (e + 150) / 3 - 50;
  24. int e_mod_3 = e - e_div_3 * 3;
  25. int n = 3;
  26. int m = 4;
  27. for (int i = 0; i < 3; i++) {
  28. if (f < T[n]) {
  29. m >>= 1;
  30. n -= m;
  31. }
  32. else {
  33. m = (m + 1 >> 1);
  34. n += m;
  35. }
  36. }
  37. x = C0[e_mod_3][n] + C1[e_mod_3][n] * f;
  38. f = ldexpf(f, e_mod_3);
  39. x += (1.f / 3.f) * (x - f * (x * x) * (x * x));
  40. return ldexpf(f * (x * x), e_div_3);
  41. }
  42.  
  43. int main() {
  44. float TABLE1[] = { 0.958102574f, 0.99999994f, 1.f };
  45. float TABLE2[] = { .5f, 0.545253866f, 0.594603558f, 0.648419777f, 0.707106781f, 0.771105413f, 0.840896415f, 0.917004043f };
  46. 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 };
  47. for (float x3 : TABLE3) {
  48. for (float x2 : TABLE2) {
  49. for (float x1 : TABLE1) {
  50. float x = x1 * x2 * x3;
  51. float y1 = cbrt_(x);
  52. float y0 = cbrt(x);
  53. printf("%e\n", (double)y1 / (double)y0 - 1.);
  54. }
  55. }
  56. }
  57. return 0;
  58. }
  59.  
Success #stdin #stdout 0s 5448KB
stdin
Standard input is empty
stdout
-2.285287e-07
-2.252914e-07
-1.501943e-07
-7.400763e-08
-1.459186e-07
-2.918371e-07
-2.876031e-07
-2.126468e-07
-7.088227e-08
0.000000e+00
-2.065932e-07
-2.065932e-07
-2.035959e-07
-6.690395e-08
-2.676158e-07
-1.977999e-07
-2.599973e-07
-2.599973e-07
-1.921689e-07
-1.894468e-07
-1.262978e-07
0.000000e+00
-2.454048e-07
-1.840536e-07
-1.209222e-07
-1.788139e-07
-2.384186e-07
-1.174798e-07
-2.316313e-07
-1.158156e-07
-2.282708e-07
-1.125186e-07
-1.125186e-07
-1.108862e-07
-2.186308e-07
-2.186308e-07
-1.077294e-07
-1.062034e-07
-2.124068e-07
-1.046626e-07
-2.063600e-07
-2.063600e-07
-2.033661e-07
-1.002427e-07
-3.007280e-07
-1.975767e-07
-1.947779e-07
-1.947779e-07
-1.919520e-07
-2.838494e-07
-1.892329e-07
-9.324377e-08
-1.838459e-07
-1.838459e-07
-2.717679e-07
-2.679182e-07
-8.930606e-08
-8.801040e-08
-1.735274e-07
-8.676370e-08
-1.710098e-07
-1.685874e-07
-1.685874e-07
-1.661415e-07
-1.637880e-07
-2.456821e-07
-2.421177e-07
-1.591253e-07
-2.386880e-07
-2.352251e-07
-1.545953e-07
-7.729766e-08
-2.285287e-07
-2.252914e-07
-1.501943e-07
-7.400763e-08
-1.459186e-07
-2.918371e-07
-2.876031e-07
-2.126468e-07
-7.088227e-08
0.000000e+00
-2.065932e-07
-2.065932e-07
-2.035959e-07
-6.690395e-08
-2.676158e-07
-1.977999e-07
-2.599973e-07
-2.599973e-07
-1.921689e-07
-1.894468e-07
-1.262978e-07
0.000000e+00
-2.454048e-07
-1.840536e-07
-1.209222e-07
-1.788139e-07
-2.384186e-07
-1.174798e-07
-2.316313e-07
-1.158156e-07
-2.282708e-07
-1.125186e-07
-1.125186e-07
-1.108862e-07
-2.186308e-07
-2.186308e-07
-1.077294e-07
-1.062034e-07
-2.124068e-07
-1.046626e-07
-2.063600e-07
-2.063600e-07
-2.033661e-07
-1.002427e-07
-3.007280e-07
-1.975767e-07
-1.947779e-07
-1.947779e-07
-1.919520e-07
-2.838494e-07
-1.892329e-07
-9.324377e-08
-1.838459e-07
-1.838459e-07
-2.717679e-07
-2.679182e-07
-8.930606e-08
-8.801040e-08
-1.735274e-07
-8.676370e-08
-1.710098e-07
-1.685874e-07
-1.685874e-07
-1.661415e-07
-1.637880e-07
-2.456821e-07
-2.421177e-07
-1.591253e-07
-2.386880e-07
-2.352251e-07
-1.545953e-07
-7.729766e-08
-2.285287e-07
-2.252914e-07
-1.501943e-07
-7.400763e-08
-1.459186e-07
-2.918371e-07
-2.876031e-07
-2.126468e-07
-7.088227e-08
0.000000e+00
-2.065932e-07
-2.065932e-07
-2.035959e-07
-6.690395e-08
-2.676158e-07
-1.977999e-07
-2.599973e-07
-2.599973e-07
-1.921689e-07
-1.894468e-07
-1.262978e-07
0.000000e+00
-2.454048e-07
-1.840536e-07
-1.209222e-07
-1.788139e-07
-2.384186e-07
-1.174798e-07
-2.316313e-07
-1.158156e-07
-2.282708e-07
-1.125186e-07
-1.125186e-07
-1.108862e-07
-2.186308e-07
-2.186308e-07
-1.077294e-07
-1.062034e-07
-2.124068e-07
-1.046626e-07
-2.063600e-07
-2.063600e-07
-2.033661e-07
-1.002427e-07
-3.007280e-07
-1.975767e-07
-1.947779e-07
-1.947779e-07
-1.919520e-07
-2.838494e-07
-1.892329e-07
-9.324377e-08
-1.838459e-07
-1.838459e-07
-2.717679e-07
-2.679182e-07
-8.930606e-08
-8.801040e-08
-1.735274e-07
-8.676370e-08
-1.710098e-07
-1.685874e-07
-1.685874e-07
-1.661415e-07
-1.637880e-07
-2.456821e-07
-2.421177e-07
-1.591253e-07
-2.386880e-07
-2.352251e-07
-1.545953e-07
-7.729766e-08
-2.285287e-07
-2.252914e-07
-1.501943e-07
-7.400763e-08
-1.459186e-07
-2.918371e-07
-2.876031e-07
-2.126468e-07
-7.088227e-08
0.000000e+00
-2.065932e-07
-2.065932e-07
-2.035959e-07
-6.690395e-08
-2.676158e-07
-1.977999e-07
-2.599973e-07
-2.599973e-07
-1.921689e-07
-1.894468e-07
-1.262978e-07
0.000000e+00
-2.454048e-07
-1.840536e-07
-1.209222e-07
-1.788139e-07
-2.384186e-07
-1.174798e-07
-2.316313e-07
-1.158156e-07
-2.282708e-07
-1.125186e-07
-1.125186e-07
-1.108862e-07
-2.186308e-07
-2.186308e-07
-1.077294e-07
-1.062034e-07
-2.124068e-07
-1.046626e-07
-2.063600e-07
-2.063600e-07
-2.033661e-07
-1.002427e-07
-3.007280e-07
-1.975767e-07
-1.947779e-07
-1.947779e-07
-1.919520e-07
-2.838494e-07
-1.892329e-07
-9.324377e-08
-1.838459e-07
-1.838459e-07
-2.717679e-07
-2.679182e-07
-8.930606e-08
-8.801040e-08
-1.735274e-07
-8.676370e-08
-1.710098e-07
-1.685874e-07
-1.685874e-07
-1.661415e-07
-1.637880e-07
-2.456821e-07
-2.421177e-07
-1.591253e-07
-2.386880e-07
-2.352251e-07
-1.545953e-07
-7.729766e-08