mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// nonfinite_legacy.cpp
 | 
						|
 | 
						|
// Distributed under the Boost Software License, Version 1.0.
 | 
						|
// (See accompanying file LICENSE_1_0.txt
 | 
						|
// or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 | 
						|
// Copyright (c) 2006 Johan Rade
 | 
						|
// Copyright (c) 2011 Paul A. Bristow
 | 
						|
 | 
						|
/*!
 | 
						|
\file
 | 
						|
\brief Basic tests of nonfinite loopback with output and input facet.
 | 
						|
 | 
						|
\detail Basic loopback test outputs using the so-called 'legacy' facets,
 | 
						|
"1.#INF"  and "1.#QNAN".
 | 
						|
 | 
						|
and reads back in using nonfinite input 'legacy' facet, and
 | 
						|
(if possible) checks if loopback OK.
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
#include <boost/math/special_functions/nonfinite_num_facets.hpp>
 | 
						|
using boost::math::nonfinite_num_put;
 | 
						|
using boost::math::nonfinite_num_get;
 | 
						|
 | 
						|
using boost::math::legacy;
 | 
						|
 | 
						|
#include <iostream>
 | 
						|
using std::cout;
 | 
						|
using std::endl;
 | 
						|
 | 
						|
#include <iomanip>
 | 
						|
using std::setfill;
 | 
						|
using std::setw;
 | 
						|
 | 
						|
#include <locale>
 | 
						|
using std::locale;
 | 
						|
 | 
						|
#include <sstream>
 | 
						|
using std::stringstream;
 | 
						|
#include <limits>
 | 
						|
using std::numeric_limits;
 | 
						|
 | 
						|
#include <assert.h>
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
  // Create a new locale with both the nonfinite facets.
 | 
						|
  std::locale new_locale(std::locale(std::locale(),
 | 
						|
    new boost::math::nonfinite_num_put<char>),
 | 
						|
    new boost::math::nonfinite_num_get<char>);
 | 
						|
 | 
						|
  {
 | 
						|
    stringstream ss;
 | 
						|
    ss.imbue(new_locale);
 | 
						|
    double inf = numeric_limits<double>::infinity();
 | 
						|
    ss << inf; // Write out.
 | 
						|
    double r;
 | 
						|
    ss >> r; // Read back in.
 | 
						|
 | 
						|
    cout << "infinity output was " << inf << endl;
 | 
						|
    cout << "infinity input was " << r << endl;
 | 
						|
 | 
						|
    assert(inf == r); 
 | 
						|
  }
 | 
						|
  {
 | 
						|
    stringstream ss;
 | 
						|
    ss.imbue(new_locale);
 | 
						|
 | 
						|
    double nan = numeric_limits<double>::quiet_NaN();
 | 
						|
    ss << nan; // Write out.
 | 
						|
    double v;
 | 
						|
    ss >> v; // Read back in.
 | 
						|
 | 
						|
    cout << "NaN output was " << nan << endl;
 | 
						|
    cout << "NaN input was " << v << endl;
 | 
						|
 | 
						|
    // assert(nan == v); // Always fails because NaN == NaN fails!
 | 
						|
    // assert(nan == numeric_limits<double>::quiet_NaN()); asserts!
 | 
						|
  }
 | 
						|
 | 
						|
} // int main()
 | 
						|
 | 
						|
/*
 | 
						|
 | 
						|
Output:
 | 
						|
 | 
						|
infinity output was 1.#INF
 | 
						|
infinity input was 1.#INF
 | 
						|
NaN output was 1.#QNAN
 | 
						|
NaN input was 1.#QNAN
 | 
						|
 | 
						|
*/
 | 
						|
 |