#include<stdio.h>
#include<stdlib.h>
#include<float.h>
#include<math.h>

	/*  Ten program będzie szukał pierwiastka równania f(x)=0. Będzie szukał metodą
		"false position". Trzeba mu podać dwa punkty, x1 i x2, takie, że f ma w nich wartości
		różnych znaków. Miedzy nimi musi więc być pierwiastek. Procedura go znajdzie
		na pewno. Jeżeli pierwiastków będzie więcej, znaleziony będzie któryś, nie wiadomo
		który.
	*/

double funkcja(double x)
{
	return x-2*sin(x);
}

int main(void)
{
	double x1,x2,x;	/* Zawierają końce przedziału w którym
					   szukać będziemy pierwiastka, oraz proponowany punkt podziału.  */
	double a,b,c;	/* Tu przechowane zostaną wartości funkcji w punktach x1,x2,x. 	*/
	double eps=DBL_EPSILON*100;	/*  To będzie nasza dokładność.   */
	printf("Ten program znajdzie pierwiastek zadanej funkcji.\n");
	do
	{
		printf("Proszę podać dwa punkty, X_1 i X_2, w których wartość funkcji ma różne znaki.\n");
		printf("\nX_1=  ");
		scanf("%lf",&x1);
		a=funkcja(x1);
		if (fabs(a)<eps)
			{
				printf("X_1 jest pierwiastkiem.\n");
				return EXIT_SUCCESS;
			}
		printf("\nX_2=  ");
		scanf("%lf",&x2);
		b=funkcja(x2);
		if (fabs(b)<eps)
			{
				printf("X_2 jest pierwiastkiem.\n");
				return EXIT_SUCCESS;
			}
		if (a*b>0)
			printf("Funkcja nie zmienia znaku w podanych punktach.\n");
	}
	while (a*b>0);

			/* Teraz szukanie iteracyjne. Kończymy, kiedy przedział ma długość nie większą niż
				nasza dokładność.
			*/

	while (fabs(x1-x2)>eps)
		{
			x=x1+(x2-x1)*a/(a-b);
			c=funkcja(x);
			if (fabs(c)<eps)
				{
					printf("Znaleziony pierwiastek: %lf\n",x);
					return EXIT_SUCCESS;
				}
			if (a*c<0)
				{
					x2=x;
					b=c;
				}
				else
					{
						x1=x;
						a=c;
					}
		}
	printf("Znaleziony pierwiastek: %lf\n",x1);
	return EXIT_SUCCESS;
}