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

double CORDIC(double y, double x)
{
	double  zweierpotenz=2.0, z=0.0, delta=-1.0;
  
	printf("Wirkungsweise des CORDIC-Algorithmus:\n\n           y_k                         z_k                Maximaler Fehler\n");
  
	while(zweierpotenz>1e-15)
	{
   
		zweierpotenz=zweierpotenz*0.5;
    
		if(y>=0.0) delta=-1.0;
			else delta=1.0;
	
		y=y+delta*x*zweierpotenz;
		z=z-delta*zweierpotenz;
	
		printf("%25.15lf  %25.15lf   %20.15lf\n", y, z, zweierpotenz);
    
	}
  
	printf("\n\n");
    
	return(z);
  
}

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

int main(void)
{
	double zaehler, nenner, zweifachnenner,  ergebnis=1.0;
 
	printf("Dieses Programm implementiert die CORDIC-Division.\n\
Geben Sie bitte Ihren Zaehler ein: "); 
 
	scanf("%lf",&zaehler);
     
	printf("Geben Sie bitte Ihren Nenner ein: ");     
 
	scanf("%lf",&nenner);  
     
	if(nenner<0)
	{
		nenner=-nenner;
		zaehler=-zaehler;
	}
     
	if(nenner<1e-14)
	{
		printf("So kleine Nenner koennen wir nicht. Abbruch!\n");   
		return(1);
	}
      
	zweifachnenner=2.0*nenner;
	if(zaehler<0)
	{
		zaehler=-zaehler;
		ergebnis=-1.0;
	}
     
	if(zaehler> zweifachnenner)
	{
		printf("Vorarbeiten: \nBetrag des Zaehlers                     Faktor\n"); 
	 
		while(zaehler> zweifachnenner)
		{
			zaehler=zaehler*0.5;
			ergebnis=ergebnis*2.0;
			printf("%25.15lf  %25.15lf\n", zaehler, ergebnis); 
		}
	 
		printf("\n\n");
	}
     
	ergebnis=ergebnis*CORDIC(zaehler, nenner);
     
	printf("\nErgebnis der Division:\n%.14lf.\n\n", ergebnis); 
     
 
	return(0);
  
}
