123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- // 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
- */
|