#if 0
gcc -Wall -std=c99 -lm nan.c
exit
#endif 

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

int main(void)
{
  double NaN17 = nan("17");
  double defaultNaN = nan("");
  double infty = 1./0.;
  double i = sqrt(-1.);

  double a, b;
  long unsigned int A, B;
  
  printf("nans:\nnan17: %e %lx\ndefault: %e %lx\ninfty: %e %lx\ni: %e %lx\n",
         NaN17, *(unsigned long int *)&NaN17,
         defaultNaN, *(unsigned long int*)&defaultNaN,
         infty, *(unsigned long int*)&infty,
         i, *(unsigned long int*)&i);

  a = 1.;
  b = a * NaN17;
  memcpy(&A, &a, sizeof(a));
  memcpy(&B, &b, sizeof(b));
  printf("%d a %e b %e A %lx B %lx \n", __LINE__, a, b, A, B);

  b = a * defaultNaN;
  memcpy(&A, &a, sizeof(a));
  memcpy(&B, &b, sizeof(b));
  printf("%d a %e b %e A %lx B %lx \n", __LINE__, a, b, A, B);

  b = a * infty;
  memcpy(&A, &a, sizeof(a));
  memcpy(&B, &b, sizeof(b));
  printf("%d a %e b %e A %lx B %lx \n", __LINE__, a, b, A, B);

  b = NaN17 * defaultNaN;
  memcpy(&A, &a, sizeof(a));
  memcpy(&B, &b, sizeof(b));
  printf("%d a %e b %e A %lx B %lx \n", __LINE__, a, b, A, B);

  printf("1 == NaN17: %d NaN17 == NaN17: %d NaN17 == defaultNaN: %d\n",
         1. == NaN17, NaN17 == NaN17, NaN17 == defaultNaN);

  return 0;
}
