#include <math.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> double sqrt_knoppi(double a) { double xneu = 0, xalt = 0, epsilon = 0.00000000001; xneu = a; do { xalt = xneu; xneu = 0.5*(xalt+a/xalt); } while((xalt-xneu) > epsilon); return xneu; } const int64_t magic_number = 0x5fe6eb50c7b537a9; double sqrt_q3(const double x) { const double xhalf = 0.5f*x; union { double x; int64_t i; } u; u.x = x; u.i = magic_number - (u.i >> 1); return x*u.x*(1.5f - xhalf*u.x*u.x); } double sqrt_q3_2(const double x) { const double xhalf = 0.5f*x; union { double x; int64_t i; } u; u.x = x; u.i = magic_number - (u.i >> 1); u.x = u.x*(1.5f - xhalf*u.x*u.x); // Mehr von dieser Zeile für höhere Präzision return x*u.x*(1.5f - xhalf*u.x*u.x); } { } void sqrt_test(double d) { } int main() { double d = 15; for(int i = 0; i < 30; ++i) { sqrt_test(d); d /= 3; } }
Standard input is empty
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