Запуск вашей программы под GDB показывает, что она находится в бесконечной рекурсии:
(gdb) run
Starting program: /tmp/a.out 0.000001 4.0
Program received signal SIGSEGV, Segmentation fault.
0x000055555555522d in sqrt (eps=<error reading variable: Cannot access memory at address 0x7fffff7feff8>,
num=<error reading variable: Cannot access memory at address 0x7fffff7feff0>, last_guess=<error reading variable: Cannot access memory at address 0x7fffff7fefe8>) at foo.cc:7
7 {
(gdb) bt 20
#0 0x000055555555522d in sqrt (eps=<error reading variable: Cannot access memory at address 0x7fffff7feff8>,
num=<error reading variable: Cannot access memory at address 0x7fffff7feff0>, last_guess=<error reading variable: Cannot access memory at address 0x7fffff7fefe8>) at foo.cc:7
#1 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
#2 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=2) at foo.cc:19
#3 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
#4 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=2) at foo.cc:19
#5 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
#6 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=2) at foo.cc:19
#7 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
#8 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=2) at foo.cc:19
#9 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
#10 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=2) at foo.cc:19
#11 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
#12 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=2) at foo.cc:19
#13 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
#14 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=2) at foo.cc:19
#15 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
#16 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=2) at foo.cc:19
#17 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
#18 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=2) at foo.cc:19
#19 0x00005555555552df in sqrt (eps=9.9999999999999995e-07, num=4, last_guess=3) at foo.cc:19
(More stack frames follow...)
- Нет причин делать вашу процедуру рекурсивной.
Ваш алгоритм не работает признать (пропускает проверку), что вы уже вычислили правильный ответ.
Не следует сравнивать дельту между вашими догадками с эпсилоном. Вместо этого вы должны сравнить дельту между вашим вычисленным ответом и реальным ответом.
Как отметил @ PaulMcKenz ie, вы не должны хранить свои последовательные приближения в целых числах (используйте double
вместо).
Чтобы исправить программу, вам нужно использовать правильную формулу для следующего предположения:
double next = (last_guess + (num/last_guess)) / 2;