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

/* --------------------------------*/

double Expo_Einheitsintervall(double x)//mit Potenzreihe
{
	double ergebnis=1.0;
	int zaehler=17;
  
	for(zaehler=17; zaehler>0; zaehler--)
		ergebnis=ergebnis*x/(double)(zaehler)+1.0;
  
	return(ergebnis);
  
}



/* --------------------------------*/

double Log_Prototyp(double x)//mit Potenzreihe
{
	double ergebnis=1.0, y=1.0-x;
	int zaehler=44;
  
	for(zaehler=44; zaehler>1; zaehler--)
		ergebnis=ergebnis*y*(((double)(zaehler)-1)/(double)(zaehler))+1.0;
  
	ergebnis=(-1.0)*y*ergebnis;
  
	return(ergebnis);
  
}

/* --------------------------------*/

double Logar(double x) //mit Potenzreihe und Funktionalgleichung
{
	double ergebnis=0.0, logzwei=(-1.0)*Log_Prototyp(0.5);
  
	while(x>1.0)
	{
		x=x*0.5;
		ergebnis=ergebnis+logzwei;
	}
  
	while(x<0.5)
	{
		x=2.0*x;
		ergebnis=ergebnis-logzwei;
	} 
  
	return(ergebnis+Log_Prototyp(x));
  
  
}

/* --------------------------------*/

double Log_bisek(double y) //mit selbstgeschriebener e-Funktion
{
	double ergebnis=0.0, faktor=1.0, euler=Expo_Einheitsintervall(1.0);
	double links=0.0, rechts=1.0, schritt=1.0;
  
	if(y<1.0)
	{
		y=1.0/y;
		faktor=-1.0;
	}
    
  
	while(y>euler)
	{
		y=y/euler;
		ergebnis=ergebnis+1.0;
	}
  
  
	while(schritt>1e-15)
	{
   
		schritt=schritt/2.0;
    
		if(Expo_Einheitsintervall(links+schritt)<y)
			links=links+schritt;
		else
			rechts=rechts-schritt;
	}
  
	ergebnis=faktor*(ergebnis+links);
  
	return(ergebnis);
}

/* --------------------------------*/

double Log_bisek_var(double y) //mit vorimplementierter e-Funktion
{
	double ergebnis=0.0, faktor=1.0, euler=exp(1.0);
	double links=0.0, rechts=1.0, schritt=1.0;
  
	if(y<1.0)
	{
		y=1.0/y;
		faktor=-1.0;
	}
    
  
	while(y>euler)
	{
		y=y/euler;
		ergebnis=ergebnis+1.0;
	}
  
  
	while(schritt>1e-15)
	{
   
		schritt=schritt/2.0;
    
		if(exp(links+schritt)<y)
			links=links+schritt;
		else
			rechts=rechts-schritt;
	}
  
	ergebnis=faktor*(ergebnis+links);
  
	return(ergebnis);
}

/* --------------------------------*/


int main(void)
{
	double zahl, ergebnis;
 
	printf("Dieses Programm berechnet den natuerlichen Logarithmus fuer von Ihnen eingegebene Argumente.\n\
Geben Sie bitte Ihre Zahl ein: "); 
 
	scanf("%lf",&zahl);
     
	if(zahl<=0)
	{
		printf("Unzulaessige Eingabe!\n");
		return(1);
	}
	else
	{
		printf("Der natuerliche Logarithmus von %lf lautet:\nTaylorpolynom mit 44 Termen auf [0.5,1],\
kombiniert mit Funktionalgleichung:\n%.15lf\
\nMittels Zwischenwertsatz und eigener exp-Funktion ermittelt:\n%.15lf    %.15lf\
\nMittels Zwischenwertsatz und vorimplementierter exp-Funktion ermittelt:\n%.15lf      %.15lf\
\nIn math.h implementierte log-Funktion:\n%.15lf      %.15lf\n", 
		zahl, Logar(zahl), Log_bisek(zahl), exp(Log_bisek(zahl)), Log_bisek_var(zahl), 
		exp(Log_bisek_var(zahl)), log(zahl), exp(log(zahl))); 
	}
     

     
 
	return(0);
  
}
