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

#include "gnuplot_i.h"

#define STUETZSTELLENANZAHL    100



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

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

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

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


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


int main(void)
{
     /*  This software uses the gnuplot_i library written by
     N.Devillard <ndevilla@free.fr>
     If you are using gnuplot_i for a web-based
     application, you can also add a link to the gnuplot home
     page:

        http://ndevilla.free.fr/gnuplot/ */
     
	gnuplot_ctrl        *bild;
	double              x[(STUETZSTELLENANZAHL+1)] ;
	double              logselbst[(STUETZSTELLENANZAHL+1)] ;
	double              logstandard[(STUETZSTELLENANZAHL+1)] ;
	double untergrenze, obergrenze, schrittweite;
	int i=0;
     
	bild = gnuplot_init();
 
	printf("Dieses Programm visualisiert die selbstgeschriebene Logarithmusfunktion auf einem von Ihnen\
angegebenen Bereich.\nGeben Sie bitte die linke Grenze dieses Bereichs ein: "); 
 
	scanf("%lf",&untergrenze);
     
	printf("Geben Sie nun bitte die rechte Grenze dieses Bereichs ein: "); 
 
	scanf("%lf",&obergrenze);
     
	if(untergrenze<=0  || obergrenze<=0 )
	{
		printf("Unzulaessige Eingabe!\n");
		return(1);
	}
     
	schrittweite=(obergrenze-untergrenze)/(double)(STUETZSTELLENANZAHL);
     
 
	for(i=0; i<=STUETZSTELLENANZAHL; i++)
	{
		x[i]=untergrenze+(double)(i)*schrittweite;
		logselbst[i]=Logar(x[i]);
		logstandard[i]=log(x[i]);
	}
     
	printf("Visualisierung Ihrer selbstgeschriebenen Logarithmusfunktion.\n\
Wenn Sie mit der implementierten Logarithmusfunktion vergleichen wollen, druecken Sie bitte return.\n");
     
	gnuplot_resetplot(bild);
	gnuplot_setstyle(bild, "points") ;
	gnuplot_plot_xy(bild, x, logselbst, (STUETZSTELLENANZAHL+1), "selbstgeschriebene Logarithmusfunktion");
     
	getchar();getchar();
     
	gnuplot_plot_xy(bild, x, logstandard, (STUETZSTELLENANZAHL+1), "implemetierte Logarithmusfunktion");
     
	printf("Wenn Sie genug gesehen haben, druecken Sie bitte return.\n");
     
	getchar();
     
	gnuplot_close(bild);
 
	return(0);
  
}
