fork(1) download
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdint.h>
  5.  
  6. double sqrt_knoppi(double a) {
  7. double xneu = 0, xalt = 0, epsilon = 0.00000000001;
  8.  
  9. xneu = a;
  10. do {
  11. xalt = xneu;
  12. xneu = 0.5*(xalt+a/xalt);
  13. } while((xalt-xneu) > epsilon);
  14.  
  15. return xneu;
  16. }
  17.  
  18. const int64_t magic_number = 0x5fe6eb50c7b537a9;
  19. double sqrt_q3(const double x)
  20. {
  21. const double xhalf = 0.5f*x;
  22. union
  23. {
  24. double x;
  25. int64_t i;
  26. } u;
  27. u.x = x;
  28. u.i = magic_number - (u.i >> 1);
  29. return x*u.x*(1.5f - xhalf*u.x*u.x);
  30. }
  31.  
  32. double sqrt_q3_2(const double x)
  33. {
  34. const double xhalf = 0.5f*x;
  35. union
  36. {
  37. double x;
  38. int64_t i;
  39. } u;
  40. u.x = x;
  41. u.i = magic_number - (u.i >> 1);
  42. u.x = u.x*(1.5f - xhalf*u.x*u.x); // Mehr von dieser Zeile für höhere Präzision
  43. return x*u.x*(1.5f - xhalf*u.x*u.x);
  44. }
  45.  
  46. void print_diff(double result, double sqrt)
  47. {
  48. printf("%.15f \tdiff = %.15f\tRel = %.15f\n", result, fabs(sqrt -result), fabs(sqrt -result)/sqrt);
  49. }
  50.  
  51. void sqrt_test(double d)
  52. {
  53. double result = sqrt(d);
  54. printf("sqrt(%.15f) = %.15f\n", d, result);
  55. printf("knoppi: sqrt(%.15f) = ", d); print_diff(sqrt_knoppi(d), result);
  56. printf("knoppi: sqrt_q3(%.15f) = ", d); print_diff(sqrt_q3(d), result);
  57. printf("knoppi: sqrt_q3_2(%.15f) = ", d); print_diff(sqrt_q3_2(d), result);
  58. putchar('\n');
  59. }
  60.  
  61. int main()
  62. {
  63. double d = 15;
  64. for(int i = 0; i < 30; ++i)
  65. {
  66. sqrt_test(d);
  67. d /= 3;
  68. }
  69. }
  70.  
Success #stdin #stdout 0s 2248KB
stdin
Standard input is empty
stdout
sqrt(15.000000000000000) = 3.872983346207417
knoppi: sqrt(15.000000000000000) = 3.872983346207417 	diff = 0.000000000000000	Rel = 0.000000000000000
knoppi: sqrt_q3(15.000000000000000) = 3.866266227557701 	diff = 0.006717118649716	Rel = 0.001734352577657
knoppi: sqrt_q3_2(15.000000000000000) = 3.872965881531826 	diff = 0.000017464675591	Rel = 0.000004509359848

sqrt(5.000000000000000) = 2.236067977499790
knoppi: sqrt(5.000000000000000) = 2.236067977499790 	diff = 0.000000000000000	Rel = 0.000000000000000
knoppi: sqrt_q3(5.000000000000000) = 2.235704268749060 	diff = 0.000363708750730	Rel = 0.000162655498129
knoppi: sqrt_q3_2(5.000000000000000) = 2.236067888765759 	diff = 0.000000088734031	Rel = 0.000000039683065

sqrt(1.666666666666667) = 1.290994448735806
knoppi: sqrt(1.666666666666667) = 1.290994448735806 	diff = 0.000000000000000	Rel = 0.000000000000000
knoppi: sqrt_q3(1.666666666666667) = 1.288961842947123 	diff = 0.002032605788682	Rel = 0.001574449673794
knoppi: sqrt_q3_2(1.666666666666667) = 1.290989650901829 	diff = 0.000004797833977	Rel = 0.000003716386218

sqrt(0.555555555555556) = 0.745355992499930
knoppi: sqrt(0.555555555555556) = 0.777777777777778 	diff = 0.032421785277848	Rel = 0.043498389499902
knoppi: sqrt_q3(0.555555555555556) = 0.744577274297101 	diff = 0.000778718202829	Rel = 0.001044760102105
knoppi: sqrt_q3_2(0.555555555555556) = 0.745354772564361 	diff = 0.000001219935569	Rel = 0.000001636715316

sqrt(0.185185185185185) = 0.430331482911935
knoppi: sqrt(0.185185185185185) = 0.592592592592593 	diff = 0.162261109680657	Rel = 0.377060745318193
knoppi: sqrt_q3(0.185185185185185) = 0.429902825932891 	diff = 0.000428656979045	Rel = 0.000996108804645
knoppi: sqrt_q3_2(0.185185185185185) = 0.430330842641112 	diff = 0.000000640270823	Rel = 0.000001487854940

sqrt(0.061728395061728) = 0.248451997499977
knoppi: sqrt(0.061728395061728) = 0.530864197530864 	diff = 0.282412200030888	Rel = 1.136687178499799
knoppi: sqrt_q3(0.061728395061728) = 0.248035399386375 	diff = 0.000416598113602	Rel = 0.001676775062363
knoppi: sqrt_q3_2(0.061728395061728) = 0.248450950273633 	diff = 0.000001047226344	Rel = 0.000004215004726

sqrt(0.020576131687243) = 0.143443827637312
knoppi: sqrt(0.020576131687243) = 0.510288065843621 	diff = 0.366844238206310	Rel = 2.557406925405331
knoppi: sqrt_q3(0.020576131687243) = 0.143374588768734 	diff = 0.000069238868577	Rel = 0.000482689772839
knoppi: sqrt_q3_2(0.020576131687243) = 0.143443777514037 	diff = 0.000000050123275	Rel = 0.000000349427894

sqrt(0.006858710562414) = 0.082817332499992
knoppi: sqrt(0.006858710562414) = 0.503429355281207 	diff = 0.420612022781215	Rel = 5.078792205499428
knoppi: sqrt_q3(0.006858710562414) = 0.082704867368535 	diff = 0.000112465131457	Rel = 0.001357990266795
knoppi: sqrt_q3_2(0.006858710562414) = 0.082817103513862 	diff = 0.000000228986130	Rel = 0.000002764954187

sqrt(0.002286236854138) = 0.047814609212437
knoppi: sqrt(0.002286236854138) = 0.501143118427069 	diff = 0.453328509214632	Rel = 9.480962339366245
knoppi: sqrt_q3(0.002286236854138) = 0.047746618845748 	diff = 0.000067990366689	Rel = 0.001421958012599
knoppi: sqrt_q3_2(0.002286236854138) = 0.047814464262004 	diff = 0.000000144950433	Rel = 0.000003031509310

sqrt(0.000762078951379) = 0.027605777499997
knoppi: sqrt(0.000762078951379) = 0.500381039475690 	diff = 0.472775261975692	Rel = 17.125953506498298
knoppi: sqrt_q3(0.000762078951379) = 0.027592681936868 	diff = 0.000013095563130	Rel = 0.000474377623664
knoppi: sqrt_q3_2(0.000762078951379) = 0.027605768183108 	diff = 0.000000009316890	Rel = 0.000000337497819

sqrt(0.000254026317126) = 0.015938203070812
knoppi: sqrt(0.000254026317126) = 0.500127013158563 	diff = 0.484188810087751	Rel = 30.379134205815490
knoppi: sqrt_q3(0.000254026317126) = 0.015923699216907 	diff = 0.000014503853905	Rel = 0.000910005591016
knoppi: sqrt_q3_2(0.000254026317126) = 0.015938183278936 	diff = 0.000000019791877	Rel = 0.000001241788471

sqrt(0.000084675439042) = 0.009201925833332
knoppi: sqrt(0.000084675439042) = 0.500042337719521 	diff = 0.490840411886189	Rel = 53.341052816161564
knoppi: sqrt_q3(0.000084675439042) = 0.009193902906829 	diff = 0.000008022926503	Rel = 0.000871874719322
knoppi: sqrt_q3_2(0.000084675439042) = 0.009201915343902 	diff = 0.000000010489431	Rel = 0.000001139916905

sqrt(0.000028225146347) = 0.005312734356937
knoppi: sqrt(0.000028225146347) = 0.500014112573174 	diff = 0.494701378216236	Rel = 93.116151680018717
knoppi: sqrt_q3(0.000028225146347) = 0.005307634484765 	diff = 0.000005099872173	Rel = 0.000959933591647
knoppi: sqrt_q3_2(0.000028225146347) = 0.005312727015979 	diff = 0.000000007340958	Rel = 0.000001381766474

sqrt(0.000009408382116) = 0.003067308611111
knoppi: sqrt(0.000009408382116) = 0.500004704191058 	diff = 0.496937395579947	Rel = 162.010889214040247
knoppi: sqrt_q3(0.000009408382116) = 0.003062163740930 	diff = 0.000005144870181	Rel = 0.001677323945328
knoppi: sqrt_q3_2(0.000009408382116) = 0.003067295673927 	diff = 0.000000012937184	Rel = 0.000004217763922

sqrt(0.000003136127372) = 0.001770911452312
knoppi: sqrt(0.000003136127372) = 0.500001568063686 	diff = 0.498230656611374	Rel = 281.341371394246892
knoppi: sqrt_q3(0.000003136127372) = 0.001770790277666 	diff = 0.000000121174647	Rel = 0.000068425017243
knoppi: sqrt_q3_2(0.000003136127372) = 0.001770911439876 	diff = 0.000000000012437	Rel = 0.000000007022814

sqrt(0.000001045375791) = 0.001022436203704
knoppi: sqrt(0.000001045375791) = 0.500000522687895 	diff = 0.498978086484192	Rel = 488.028577897305865
knoppi: sqrt_q3(0.000001045375791) = 0.001022155683523 	diff = 0.000000280520181	Rel = 0.000274364483135
knoppi: sqrt_q3_2(0.000001045375791) = 0.001022436088267 	diff = 0.000000000115437	Rel = 0.000000112903478

sqrt(0.000000348458597) = 0.000590303817437
knoppi: sqrt(0.000000348458597) = 0.500000174229298 	diff = 0.499409870411861	Rel = 846.021752967470889
knoppi: sqrt_q3(0.000000348458597) = 0.000589571820155 	diff = 0.000000731997282	Rel = 0.001240034810251
knoppi: sqrt_q3_2(0.000000348458597) = 0.000590302456447 	diff = 0.000000001360990	Rel = 0.000002305576104

sqrt(0.000000116152866) = 0.000340812067901
knoppi: sqrt(0.000000116152866) = 0.500000058076433 	diff = 0.499659246008532	Rel = 1466.084370443646094
knoppi: sqrt_q3(0.000000116152866) = 0.000340650567732 	diff = 0.000000161500169	Rel = 0.000473868693789
knoppi: sqrt_q3_2(0.000000116152866) = 0.000340811953125 	diff = 0.000000000114777	Rel = 0.000000336774104

sqrt(0.000000038717622) = 0.000196767939146
knoppi: sqrt(0.000000038717622) = 0.500000019358811 	diff = 0.499803251419665	Rel = 2540.064471830655748
knoppi: sqrt_q3(0.000000038717622) = 0.000196423921278 	diff = 0.000000344017868	Rel = 0.001748343096500
knoppi: sqrt_q3_2(0.000000038717622) = 0.000196767037480 	diff = 0.000000000901666	Rel = 0.000004582383291

sqrt(0.000000012905874) = 0.000113604022634
knoppi: sqrt(0.000000012905874) = 0.500000006452937 	diff = 0.499886402430303	Rel = 4400.252656914847648
knoppi: sqrt_q3(0.000000012905874) = 0.000113594188990 	diff = 0.000000009833644	Rel = 0.000086560701510
knoppi: sqrt_q3_2(0.000000012905874) = 0.000113604021357 	diff = 0.000000000001277	Rel = 0.000000011238808

sqrt(0.000000004301958) = 0.000065589313049
knoppi: sqrt(0.000000004301958) = 0.500000002150979 	diff = 0.499934412837930	Rel = 7622.193153134715430
knoppi: sqrt_q3(0.000000004301958) = 0.000065588264195 	diff = 0.000000001048854	Rel = 0.000015991234539
knoppi: sqrt_q3_2(0.000000004301958) = 0.000065589313023 	diff = 0.000000000000025	Rel = 0.000000000383577

sqrt(0.000000001433986) = 0.000037868007545
knoppi: sqrt(0.000000001433986) = 0.500000000716993 	diff = 0.499962132709448	Rel = 13202.757819272512279
knoppi: sqrt_q3(0.000000001433986) = 0.000037810993970 	diff = 0.000000057013574	Rel = 0.001505586857971
knoppi: sqrt_q3_2(0.000000001433986) = 0.000037867878851 	diff = 0.000000000128694	Rel = 0.000003398481254

sqrt(0.000000000477995) = 0.000021863104350
knoppi: sqrt(0.000000000477995) = 0.500000000238998 	diff = 0.499978137134648	Rel = 22868.579371951731446
knoppi: sqrt_q3(0.000000000477995) = 0.000021853869720 	diff = 0.000000009234629	Rel = 0.000422384184312
knoppi: sqrt_q3_2(0.000000000477995) = 0.000021863098500 	diff = 0.000000000005850	Rel = 0.000000267574920

sqrt(0.000000000159332) = 0.000012622669182
knoppi: sqrt(0.000000000159332) = 0.500000000079666 	diff = 0.499987377410484	Rel = 39610.273407326865708
knoppi: sqrt_q3(0.000000000159332) = 0.000012602455680 	diff = 0.000000020213502	Rel = 0.001601365079137
knoppi: sqrt_q3_2(0.000000000159332) = 0.000012622620654 	diff = 0.000000000048528	Rel = 0.000003844501929

sqrt(0.000000000053111) = 0.000007287701450
knoppi: sqrt(0.000000000053111) = 0.500000000026555 	diff = 0.499992712325105	Rel = 68607.738086704383022
knoppi: sqrt_q3(0.000000000053111) = 0.000007280562061 	diff = 0.000000007139389	Rel = 0.000979648954038
knoppi: sqrt_q3_2(0.000000000053111) = 0.000007287690962 	diff = 0.000000000010488	Rel = 0.000001439098019

sqrt(0.000000000017704) = 0.000004207556394
knoppi: sqrt(0.000000000017704) = 0.500000000008852 	diff = 0.499995792452458	Rel = 118832.820205150361289
knoppi: sqrt_q3(0.000000000017704) = 0.000004207327824 	diff = 0.000000000228570	Rel = 0.000054323685985
knoppi: sqrt_q3_2(0.000000000017704) = 0.000004207556375 	diff = 0.000000000000019	Rel = 0.000000004426514

sqrt(0.000000000005901) = 0.000002429233817
knoppi: sqrt(0.000000000005901) = 0.500000000002951 	diff = 0.499997570769134	Rel = 205825.214250396238640
knoppi: sqrt_q3(0.000000000005901) = 0.000002425338182 	diff = 0.000000003895635	Rel = 0.001603647471624
knoppi: sqrt_q3_2(0.000000000005901) = 0.000002429224451 	diff = 0.000000000009366	Rel = 0.000003855465782

sqrt(0.000000000001967) = 0.000001402518798
knoppi: sqrt(0.000000000001967) = 0.500000000000984 	diff = 0.499998597482186	Rel = 356500.460609840985853
knoppi: sqrt_q3(0.000000000001967) = 0.000001401359247 	diff = 0.000000001159551	Rel = 0.000826763191846
knoppi: sqrt_q3_2(0.000000000001967) = 0.000001402517360 	diff = 0.000000000001438	Rel = 0.000001025023501

sqrt(0.000000000000656) = 0.000000809744606
knoppi: sqrt(0.000000000000656) = 0.500000000000328 	diff = 0.499999190255722	Rel = 617477.642747949576005
knoppi: sqrt_q3(0.000000000000656) = 0.000000808736550 	diff = 0.000000001008056	Rel = 0.001244906073240
knoppi: sqrt_q3_2(0.000000000000656) = 0.000000809742724 	diff = 0.000000000001882	Rel = 0.000002323722025

sqrt(0.000000000000219) = 0.000000467506266
knoppi: sqrt(0.000000000000219) = 0.500000000000109 	diff = 0.499999532493843	Rel = 1069503.381827652687207
knoppi: sqrt_q3(0.000000000000219) = 0.000000466719511 	diff = 0.000000000786755	Rel = 0.001682875226378
knoppi: sqrt_q3_2(0.000000000000219) = 0.000000467504281 	diff = 0.000000000001985	Rel = 0.000004245720532