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

# define MAX_STEPS 1000000

int main ( int argc, char **argv )
{
    long int _steps;
    long double steps; /* for speed, comparision between the same types is
			* faster */ 
    register long double i, j;
    long double sum = 0;

    if ( argc <= 1 || ( _steps = atoi ( argv[1] ) ) <= 0 )
    {
	printf ( "Bitte Anzahl Schritte eingeben: " );
	_flushlbf ();
	scanf  ( "%ld", &_steps );
    }

    if ( _steps < 0 || _steps > MAX_STEPS )
    {
	_steps = MAX_STEPS;
	printf ( "Die eingegebene Zahl ist zu groß, nehme %d an!\n",
		 MAX_STEPS );
    }

    steps = ( long double ) _steps + 1.0;

    for ( i = 1.0, j = 2.0; i < steps; i ++, j *= 2.0 )
	sum += i / j;

    printf ( "\
bei %ld %s ist die Summe von\n\
1/2 + 2/4 + 3/8 + 4/16 + ... gleich\n\
%.30Lf\n",
	     _steps,
	     ( _steps == 1 ) ? ( "Schritt" ) : ( "Schritten" ),
	     sum );

    return 0;
}
