# include <cstdlib>
# include <iomanip>
# include <iostream>
# include <ctime>
# include <float.h>
# include <limits.h>

using namespace std;

int main ( );
void test01 ( );
void timestamp ( );

//****************************************************************************80

int main ( )

//****************************************************************************80
//
//  Purpose:
//
//    MAIN is the main program for BIG_INTS_REAL.
//
//  Licensing:
//
//    This code is distributed under the GNU LGPL license. 
//
//  Modified:
//
//    28 September 2014
//
//  Author:
//
//    John Burkardt
//
{
  timestamp ( );
  cout << "\n";
  cout << "BIG_INTS_REAL:\n";
  cout << "  C++ version\n";
  cout << "  Examine the transfer of integer values into and out of real variables.\n";

  test01 ( );
//
//  Terminate.
//
  cout << "\n";
  cout << "BIG_INTS_REAL:\n";
  cout << "  Normal end of execution.\n";
  cout << "\n";
  timestamp ( );

  return 0;
}
//****************************************************************************80

void test01 ( )

//****************************************************************************80
//
//  Purpose:
//
//    TEST01 stores huge integers as reals.
//
//  Licensing:
//
//    This code is distributed under the GNU LGPL license.
//
//  Modified:
//
//    28 September 2014
//
//  Author:
//
//    John Burkardt
//
{
  int i4;
  int i4r4i4;
  int i4r8i4;
  long long int i8;
  long long int i8r4i8;
  long long int i8r8i8;
  float r4;
  float r4i4;
  float r4i8;
  double r8;
  double r8i4;
  double r8i8;

  cout << "\n";
  cout << "TEST01\n";
  cout << "  Compute the largest possible integers.\n";
  cout << "  Try to store them as real values.\n";
  cout << "  Then copy them back.\n";

  cout << "\n";
  cout << "  'Huge' integers and huge reals:\n";
  cout << "\n";

  i4 = INT_MAX;
  i8 = LLONG_MAX;
  r4 = FLT_MAX;
  r8 = DBL_MAX;

  cout << "  i4 = INT_MAX   = " << i4 << "\n";
  cout << "  i8 = LLONG_MAX = " << i8 << "\n";
  cout << "  r4 = FLT_MAX   = " << r4 << "\n";
  cout << "  r8 = DBL_MAX   = " << r8 << "\n";

  cout << "\n";
  cout << "  Convert huge integers to real values:\n";
  cout << "\n";

  r4i4 = ( float ) ( i4 );
  r4i8 = ( float ) ( i8 );
  r8i4 = ( double ) ( i4 );
  r8i8 = ( double ) ( i8 );

  cout << "  r4i4 = ( float ) ( i4 )  = " << r4i4 << "\n";
  cout << "  r4i8 = ( float ) ( i8 )  = " << r4i8 << "\n";
  cout << "  r8i4 = ( double ) ( i4 ) = " << r8i4 << "\n";
  cout << "  r8i8 = ( double ) ( i8 ) = " << r8i8 << "\n";

  cout << "\n";
  cout << "  Convert real values of integers back to integers:\n";
  cout << "\n";

  i4r4i4 = ( int ) ( r4i4 );
  i4r8i4 = ( int ) ( r8i4 );
  i8r4i8 = ( long long int ) ( r4i8 );
  i8r8i8 = ( long long int ) ( r8i8 );

  cout << "  i4r4i4 = ( int ) ( r4i4 )           = " << i4r4i4 << "\n";
  cout << "  i4r8i4 = ( int ) ( r8i4 )           = " << i4r8i4 << "\n";
  cout << "  i8r4i8 = ( long long int ) ( r4i8 ) = " << i8r4i8 << "\n";
  cout << "  i8r8i8 = ( long long int ) ( r8i8 ) = " << i8r8i8 << "\n";

  return;
}
//****************************************************************************80

void timestamp ( )

//****************************************************************************80
//
//  Purpose:
//
//    TIMESTAMP prints the current YMDHMS date as a time stamp.
//
//  Example:
//
//    31 May 2001 09:45:54 AM
//
//  Licensing:
//
//    This code is distributed under the GNU LGPL license. 
//
//  Modified:
//
//    08 July 2009
//
//  Author:
//
//    John Burkardt
//
//  Parameters:
//
//    None
//
{
# define TIME_SIZE 40

  static char time_buffer[TIME_SIZE];
  const struct std::tm *tm_ptr;
  size_t len;
  std::time_t now;

  now = std::time ( NULL );
  tm_ptr = std::localtime ( &now );

  len = std::strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm_ptr );

  std::cout << time_buffer << "\n";

  return;
# undef TIME_SIZE
}