fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. float sqrt_(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[2][8] = {
  7. {2.075945786f, 1.987932496f, 1.903650680f, 1.822942136f, 1.745655370f, 1.671645309f, 1.600773032f, 1.532905508f },
  8. {1.467915343f, 1.405680548f, 1.346084305f, 1.289014746f, 1.234364750f, 1.182031734f, 1.131917466f, 1.083927879f },
  9. };
  10. static const float C1[2][8] = {
  11. {-1.324459632f, -1.163042545f, -1.021297991f, -0.896828402f, -0.787528409f, -0.691549235f, -0.607267419f, -0.533257358f },
  12. {-0.936534387f, -0.822395271f, -0.722166735f, -0.634153445f, -0.556866678f, -0.488999154f, -0.429402910f, -0.377069894f },
  13. };
  14.  
  15. if (x < 0.f) {
  16. return NAN;
  17. }
  18.  
  19. int e;
  20. float f = frexpf(x, &e);
  21. int e_div_2 = e >> 1;
  22. int e_mod_2 = e & 1;
  23. int n = 3;
  24. int m = 4;
  25. for (int i = 0; i < 3; i++) {
  26. if (f < T[n]) {
  27. m >>= 1;
  28. n -= m;
  29. }
  30. else {
  31. m = (m + 1 >> 1);
  32. n += m;
  33. }
  34. }
  35. x = C0[e_mod_2][n] + C1[e_mod_2][n] * f;
  36. f = ldexpf(f, e_mod_2);
  37. x += .5f * x * (1.f - f * x * x);
  38. return ldexpf(f * x, e_div_2);
  39. }
  40.  
  41. int main() {
  42. float TABLE1[] = { 0.958202441f, 0.99999994f, 1.f };
  43. float TABLE2[] = { .5f, 0.545253866f, 0.594603558f, 0.648419777f, 0.707106781f, 0.771105413f, 0.840896415f, 0.917004043f };
  44. float TABLE3[] = { 0.125f, 0.25f, 0.5f, 1.f, 2.f, 4.f, 8.f, 16.f, 32.f };
  45. for (float x3 : TABLE3) {
  46. for (float x2 : TABLE2) {
  47. for (float x1 : TABLE1) {
  48. float x = x1 * x2 * x3;
  49. float y1 = sqrt_(x);
  50. float y0 = sqrt(x);
  51. printf("%e\n", (double)y1 / (double)y0 - 1.);
  52. }
  53. }
  54. }
  55. return 0;
  56. }
  57.  
Success #stdin #stdout 0.01s 5564KB
stdin
Standard input is empty
stdout
-2.435631e-07
-1.788139e-07
-1.788139e-07
-2.332368e-07
-2.283104e-07
-1.141552e-07
-2.233483e-07
-1.093154e-07
-2.186308e-07
-1.069395e-07
-1.046808e-07
-2.093616e-07
-2.048113e-07
-2.004853e-07
-2.004853e-07
-9.806400e-08
-1.919854e-07
-9.599271e-08
-1.878128e-07
-1.838459e-07
-2.757688e-07
-1.798502e-07
-1.760514e-07
-1.760514e-07
-2.583377e-07
-1.685874e-07
-1.685874e-07
-1.649233e-07
-2.421598e-07
-1.614398e-07
-2.368967e-07
-2.318930e-07
-1.545953e-07
-1.512354e-07
-2.220615e-07
-2.220615e-07
-2.172352e-07
-2.126468e-07
-1.417645e-07
-2.080252e-07
-2.036313e-07
-1.357542e-07
-1.328037e-07
-1.949980e-07
-1.949980e-07
-1.271733e-07
-1.867307e-07
-1.244871e-07
-2.435631e-07
-1.788139e-07
-1.788139e-07
-2.332368e-07
-2.283104e-07
-1.141552e-07
-2.233483e-07
-1.093154e-07
-2.186308e-07
-1.069395e-07
-1.046808e-07
-2.093616e-07
-2.048113e-07
-2.004853e-07
-2.004853e-07
-9.806400e-08
-1.919854e-07
-9.599271e-08
-1.878128e-07
-1.838459e-07
-2.757688e-07
-1.798502e-07
-1.760514e-07
-1.760514e-07
-2.583377e-07
-1.685874e-07
-1.685874e-07
-1.649233e-07
-2.421598e-07
-1.614398e-07
-2.368967e-07
-2.318930e-07
-1.545953e-07
-1.512354e-07
-2.220615e-07
-2.220615e-07
-2.172352e-07
-2.126468e-07
-1.417645e-07
-2.080252e-07
-2.036313e-07
-1.357542e-07
-1.328037e-07
-1.949980e-07
-1.949980e-07
-1.271733e-07
-1.867307e-07
-1.244871e-07
-2.435631e-07
-1.788139e-07
-1.788139e-07
-2.332368e-07
-2.283104e-07
-1.141552e-07
-2.233483e-07
-1.093154e-07
-2.186308e-07
-1.069395e-07
-1.046808e-07
-2.093616e-07
-2.048113e-07
-2.004853e-07
-2.004853e-07
-9.806400e-08
-1.919854e-07
-9.599271e-08
-1.878128e-07
-1.838459e-07
-2.757688e-07
-1.798502e-07
-1.760514e-07
-1.760514e-07
-2.583377e-07
-1.685874e-07
-1.685874e-07
-1.649233e-07
-2.421598e-07
-1.614398e-07
-2.368967e-07
-2.318930e-07
-1.545953e-07
-1.512354e-07
-2.220615e-07
-2.220615e-07
-2.172352e-07
-2.126468e-07
-1.417645e-07
-2.080252e-07
-2.036313e-07
-1.357542e-07
-1.328037e-07
-1.949980e-07
-1.949980e-07
-1.271733e-07
-1.867307e-07
-1.244871e-07
-2.435631e-07
-1.788139e-07
-1.788139e-07
-2.332368e-07
-2.283104e-07
-1.141552e-07
-2.233483e-07
-1.093154e-07
-2.186308e-07
-1.069395e-07
-1.046808e-07
-2.093616e-07
-2.048113e-07
-2.004853e-07
-2.004853e-07
-9.806400e-08
-1.919854e-07
-9.599271e-08
-1.878128e-07
-1.838459e-07
-2.757688e-07
-1.798502e-07
-1.760514e-07
-1.760514e-07
-2.583377e-07
-1.685874e-07
-1.685874e-07
-1.649233e-07
-2.421598e-07
-1.614398e-07
-2.368967e-07
-2.318930e-07
-1.545953e-07
-1.512354e-07
-2.220615e-07
-2.220615e-07
-2.172352e-07
-2.126468e-07
-1.417645e-07
-2.080252e-07
-2.036313e-07
-1.357542e-07
-1.328037e-07
-1.949980e-07
-1.949980e-07
-1.271733e-07
-1.867307e-07
-1.244871e-07
-2.435631e-07
-1.788139e-07
-1.788139e-07
-2.332368e-07
-2.283104e-07
-1.141552e-07
-2.233483e-07
-1.093154e-07
-2.186308e-07
-1.069395e-07
-1.046808e-07
-2.093616e-07
-2.048113e-07
-2.004853e-07
-2.004853e-07
-9.806400e-08
-1.919854e-07
-9.599271e-08
-1.878128e-07
-1.838459e-07
-2.757688e-07
-1.798502e-07
-1.760514e-07
-1.760514e-07