Я только что проверил, да, на 53..59 итерации (в зависимости от исходных значений) double переменные становятся равными.
Гм. Так быть не должно. На всякий случай поставил простейший эксперимент.
Код:
#include <stdio.h>
#include <math.h>
#include <float.h>
#include <limits.h>
double f(double);
double f(double x)
{ return x*x-2; }
main()
{
int count, maxcount;
double a,b,x1,x2,x3;
a=1.1, b=1.8;
x1=a, x2=b, count=0, maxcount=5000;
while(x1<x2 && count < maxcount) {
x3=(x1+x2)/2;
if(f(x3)<0) x1=x3;
else x2=x3;
count++;
}
printf("count=%d\n", count);
printf("left=%f, right=%f, difference=%e\n", x1,x2, x2-x1);
return;
}
Выдача: count=5000, left=1.14214, right=1.14214, difference=2.220446e-016.
То есть концы интервала устанавливаются в два соседних числа с плавающей точкой, и дальше зацикливание. Т.е. как и должно быть.
А можно на Ваш код взглянуть ?