Initial commit
This commit is contained in:
224
libs/math/example/inspect_fp.cpp
Normal file
224
libs/math/example/inspect_fp.cpp
Normal file
@@ -0,0 +1,224 @@
|
||||
// inspect.cpp
|
||||
|
||||
// Copyright (c) 2006 Johan Rade
|
||||
|
||||
// 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)
|
||||
|
||||
//-------------------------------------
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <boost/detail/endian.hpp>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
bool is_big_endian()
|
||||
{
|
||||
float x = 1.0f;
|
||||
unsigned char first_byte;
|
||||
memcpy(&first_byte, &x, 1);
|
||||
return first_byte != 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
void print_processor();
|
||||
void print_endianness();
|
||||
template<class T> void print_table();
|
||||
template<class T> void print_row(const char* name, T val, bool ok = true);
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
int main()
|
||||
{
|
||||
std::cout << '\n';
|
||||
|
||||
print_processor();
|
||||
|
||||
print_endianness();
|
||||
|
||||
std::cout << "---------- float --------------------\n\n";
|
||||
print_table<float>();
|
||||
|
||||
std::cout << "---------- double -------------------\n\n";
|
||||
print_table<double>();
|
||||
|
||||
std::cout << "---------- long double --------------\n\n";
|
||||
print_table<long double>();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
void print_processor()
|
||||
{
|
||||
#if defined(__i386) || defined(__i386__) || defined(_M_IX86) \
|
||||
|| defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) \
|
||||
|| defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)
|
||||
|
||||
std::cout << "Processor: x86 or x64\n\n";
|
||||
|
||||
#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
|
||||
|
||||
std::cout << "Processor: ia64\n\n";
|
||||
|
||||
#elif defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) \
|
||||
|| defined(__ppc) || defined(__ppc__) || defined(__PPC__)
|
||||
|
||||
std::cout << "Processor: PowerPC\n\n";
|
||||
|
||||
#elif defined(__m68k) || defined(__m68k__) \
|
||||
|| defined(__mc68000) || defined(__mc68000__) \
|
||||
|
||||
std::cout << "Processor: Motorola 68K\n\n";
|
||||
|
||||
#else
|
||||
|
||||
std::cout << "Processor: Unknown\n\n";
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void print_endianness()
|
||||
{
|
||||
if(is_big_endian())
|
||||
std::cout << "This platform is big-endian.\n";
|
||||
else
|
||||
std::cout << "This platform is little-endian.\n";
|
||||
|
||||
#ifdef BOOST_BIG_ENDIAN
|
||||
std::cout << "BOOST_BIG_ENDIAN is defined.\n\n";
|
||||
#endif
|
||||
#if defined BOOST_LITTLE_ENDIAN
|
||||
std::cout << "BOOST_LITTTLE_ENDIAN is defined.\n\n";
|
||||
#endif
|
||||
}
|
||||
|
||||
//..............................................................................
|
||||
|
||||
template<class T> void print_table()
|
||||
{
|
||||
print_row("0", (T)0);
|
||||
print_row("sn.min", std::numeric_limits<T>::denorm_min(),
|
||||
std::numeric_limits<T>::has_denorm);
|
||||
print_row("-sn.min", -std::numeric_limits<T>::denorm_min(),
|
||||
std::numeric_limits<T>::has_denorm);
|
||||
print_row("n.min/256", (std::numeric_limits<T>::min)()/256);
|
||||
print_row("n.min/2", (std::numeric_limits<T>::min)()/2);
|
||||
print_row("-n.min/2", -(std::numeric_limits<T>::min)()/2);
|
||||
print_row("n.min", (std::numeric_limits<T>::min)());
|
||||
print_row("1", (T)1);
|
||||
print_row("3/4", (T)3/(T)4);
|
||||
print_row("4/3", (T)4/(T)3);
|
||||
print_row("max", (std::numeric_limits<T>::max)());
|
||||
print_row("inf", std::numeric_limits<T>::infinity(),
|
||||
std::numeric_limits<T>::has_infinity);
|
||||
print_row("q.nan", std::numeric_limits<T>::quiet_NaN(),
|
||||
std::numeric_limits<T>::has_quiet_NaN);
|
||||
print_row("s.nan", std::numeric_limits<T>::signaling_NaN(),
|
||||
std::numeric_limits<T>::has_signaling_NaN);
|
||||
|
||||
std::cout << "\n\n";
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void print_row(const char* name, T val, bool ok)
|
||||
{
|
||||
std::cout << std::left << std::setw(10) << name << std::right;
|
||||
|
||||
std::cout << std::hex << std::setfill('0');
|
||||
|
||||
if(ok) {
|
||||
if(is_big_endian()) {
|
||||
for(size_t i = 0; i < sizeof(T); ++i) {
|
||||
unsigned char c = *(reinterpret_cast<unsigned char*>(&val) + i);
|
||||
std::cout << std::setw(2)
|
||||
<< static_cast<unsigned int>(c) << ' ';
|
||||
}
|
||||
}
|
||||
else {
|
||||
for(size_t i = sizeof(T) - 1; i < sizeof(T); --i) {
|
||||
unsigned char c = *(reinterpret_cast<unsigned char*>(&val) + i);
|
||||
std::cout << std::setw(2)
|
||||
<< static_cast<unsigned int>(c) << ' ';
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for(size_t i = 0; i < sizeof(T); ++i)
|
||||
std::cout << "-- ";
|
||||
}
|
||||
|
||||
std::cout << '\n';
|
||||
std::cout << std::dec << std::setfill(' ');
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Sample output on an AMD Quadcore running MSVC 10
|
||||
|
||||
Processor: x86 or x64
|
||||
|
||||
This platform is little-endian.
|
||||
BOOST_LITTTLE_ENDIAN is defined.
|
||||
|
||||
---------- float --------------------
|
||||
|
||||
0 00 00 00 00
|
||||
sn.min 00 00 00 01
|
||||
-sn.min 80 00 00 01
|
||||
n.min/256 00 00 80 00
|
||||
n.min/2 00 40 00 00
|
||||
-n.min/2 80 40 00 00
|
||||
n.min 00 80 00 00
|
||||
1 3f 80 00 00
|
||||
3/4 3f 40 00 00
|
||||
4/3 3f aa aa ab
|
||||
max 7f 7f ff ff
|
||||
inf 7f 80 00 00
|
||||
q.nan 7f c0 00 00
|
||||
s.nan 7f c0 00 01
|
||||
|
||||
|
||||
---------- double -------------------
|
||||
|
||||
0 00 00 00 00 00 00 00 00
|
||||
sn.min 00 00 00 00 00 00 00 01
|
||||
-sn.min 80 00 00 00 00 00 00 01
|
||||
n.min/256 00 00 10 00 00 00 00 00
|
||||
n.min/2 00 08 00 00 00 00 00 00
|
||||
-n.min/2 80 08 00 00 00 00 00 00
|
||||
n.min 00 10 00 00 00 00 00 00
|
||||
1 3f f0 00 00 00 00 00 00
|
||||
3/4 3f e8 00 00 00 00 00 00
|
||||
4/3 3f f5 55 55 55 55 55 55
|
||||
max 7f ef ff ff ff ff ff ff
|
||||
inf 7f f0 00 00 00 00 00 00
|
||||
q.nan 7f f8 00 00 00 00 00 00
|
||||
s.nan 7f f8 00 00 00 00 00 01
|
||||
|
||||
|
||||
---------- long double --------------
|
||||
|
||||
0 00 00 00 00 00 00 00 00
|
||||
sn.min 00 00 00 00 00 00 00 01
|
||||
-sn.min 80 00 00 00 00 00 00 01
|
||||
n.min/256 00 00 10 00 00 00 00 00
|
||||
n.min/2 00 08 00 00 00 00 00 00
|
||||
-n.min/2 80 08 00 00 00 00 00 00
|
||||
n.min 00 10 00 00 00 00 00 00
|
||||
1 3f f0 00 00 00 00 00 00
|
||||
3/4 3f e8 00 00 00 00 00 00
|
||||
4/3 3f f5 55 55 55 55 55 55
|
||||
max 7f ef ff ff ff ff ff ff
|
||||
inf 7f f0 00 00 00 00 00 00
|
||||
q.nan 7f f8 00 00 00 00 00 00
|
||||
s.nan 7f f8 00 00 00 00 00 01
|
||||
|
||||
*/
|
||||
Reference in New Issue
Block a user