/***************************************************************************
 * File:     nauw.c
 * Status:   26-feb-2002, pfk.
 *           24-aug-2010 wlm
 *           Voorbeeld van (gebrek aan) nauwkeurigheid:
 *           Bereken eerst oplopende machten van een erg klein getal en
 *           deel daarna de laatstverkregen uitkomst door oplopende machten.
 *           Het nieuwe resultaat wordt steeds uit het vorige berekend,
 *           waardoor cumulatie van nauwkeurigheidsfouten optreedt.
 *           De berekening wordt zowel in float als in double uitgevoerd.
 *           Het laatste resultaat moet 1.0 zijn.
 ***************************************************************************/

#include <stdio.h>
#include <stdlib.h>  


#define MAXIMUM 4                     /* hoogste macht */

int main(int argc, char *argv[])
{
  float  Xfloat  = 0.000000000001;    /* beginwaarde in floating point */
  float  fResult;                     /* (tussen)resultaat in float */
  double Xdouble = 0.000000000001;    /* beginwaarde in double precision */ 
  double dResult;                     /* (tussen)resultaat in double */
  int    counter;                     /* teller voor tijdelijk gebruik */

  fResult = 1.0;                      /* startwaarde */
  dResult = 1.0;                      /* startwaarde */

  printf ("\nVoorbeeld van (gebrek aan) nauwkeurigheid:\n");
  printf ("  Dezelfde berekeningen worden uitgevoerd in\n");
  printf ("  floating point en in double precision,\n");
  printf ("  uitgaande van  X = %14.12f = %e.\n", Xfloat, Xfloat);
  printf ("  Resultaten worden exponentieel (resp. float) weergegeven.\n");
  printf ("  De exacte uitkomst is 1.0 (een)!\n\n");

  printf ("Berekende    Resultaat in           Resultaat in\n");
  printf ("waarde       floating point         double precision\n");

  /* Vermenigvuldig resultaat met X. */
  for (counter=1; counter<=MAXIMUM; counter++)
  {
    fResult *= Xfloat;
    dResult *= Xdouble;
    printf ("X^%d          %e  ", counter, fResult);
    printf (     "         %e\n", dResult);
  }

  /* Deel resultaat door X. */
  for (counter=1; counter<=MAXIMUM; counter++)
  {
    fResult /= Xfloat;
    dResult /= Xdouble;
    printf ("X^%d / X^%d    %e (%3.1f)  ", MAXIMUM, counter, fResult, fResult);
    printf (            "   %e (%3.1f)\n", dResult, dResult);
  }

  printf ("\nEinde programma.\n\n");

#ifdef _WIN32  
    system("PAUSE");
#endif
    return EXIT_SUCCESS;
}
