inspect_fp.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. // inspect.cpp
  2. // Copyright (c) 2006 Johan Rade
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt
  5. // or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //-------------------------------------
  7. #include <cstring>
  8. #include <iomanip>
  9. #include <iostream>
  10. #include <limits>
  11. #include <boost/detail/endian.hpp>
  12. //------------------------------------------------------------------------------
  13. bool is_big_endian()
  14. {
  15. float x = 1.0f;
  16. unsigned char first_byte;
  17. memcpy(&first_byte, &x, 1);
  18. return first_byte != 0;
  19. }
  20. //------------------------------------------------------------------------------
  21. void print_processor();
  22. void print_endianness();
  23. template<class T> void print_table();
  24. template<class T> void print_row(const char* name, T val, bool ok = true);
  25. //------------------------------------------------------------------------------
  26. int main()
  27. {
  28. std::cout << '\n';
  29. print_processor();
  30. print_endianness();
  31. std::cout << "---------- float --------------------\n\n";
  32. print_table<float>();
  33. std::cout << "---------- double -------------------\n\n";
  34. print_table<double>();
  35. std::cout << "---------- long double --------------\n\n";
  36. print_table<long double>();
  37. return 0;
  38. }
  39. //------------------------------------------------------------------------------
  40. void print_processor()
  41. {
  42. #if defined(__i386) || defined(__i386__) || defined(_M_IX86) \
  43. || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) \
  44. || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)
  45. std::cout << "Processor: x86 or x64\n\n";
  46. #elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
  47. std::cout << "Processor: ia64\n\n";
  48. #elif defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) \
  49. || defined(__ppc) || defined(__ppc__) || defined(__PPC__)
  50. std::cout << "Processor: PowerPC\n\n";
  51. #elif defined(__m68k) || defined(__m68k__) \
  52. || defined(__mc68000) || defined(__mc68000__) \
  53. std::cout << "Processor: Motorola 68K\n\n";
  54. #else
  55. std::cout << "Processor: Unknown\n\n";
  56. #endif
  57. }
  58. void print_endianness()
  59. {
  60. if(is_big_endian())
  61. std::cout << "This platform is big-endian.\n";
  62. else
  63. std::cout << "This platform is little-endian.\n";
  64. #ifdef BOOST_BIG_ENDIAN
  65. std::cout << "BOOST_BIG_ENDIAN is defined.\n\n";
  66. #endif
  67. #if defined BOOST_LITTLE_ENDIAN
  68. std::cout << "BOOST_LITTTLE_ENDIAN is defined.\n\n";
  69. #endif
  70. }
  71. //..............................................................................
  72. template<class T> void print_table()
  73. {
  74. print_row("0", (T)0);
  75. print_row("sn.min", std::numeric_limits<T>::denorm_min(),
  76. std::numeric_limits<T>::has_denorm);
  77. print_row("-sn.min", -std::numeric_limits<T>::denorm_min(),
  78. std::numeric_limits<T>::has_denorm);
  79. print_row("n.min/256", (std::numeric_limits<T>::min)()/256);
  80. print_row("n.min/2", (std::numeric_limits<T>::min)()/2);
  81. print_row("-n.min/2", -(std::numeric_limits<T>::min)()/2);
  82. print_row("n.min", (std::numeric_limits<T>::min)());
  83. print_row("1", (T)1);
  84. print_row("3/4", (T)3/(T)4);
  85. print_row("4/3", (T)4/(T)3);
  86. print_row("max", (std::numeric_limits<T>::max)());
  87. print_row("inf", std::numeric_limits<T>::infinity(),
  88. std::numeric_limits<T>::has_infinity);
  89. print_row("q.nan", std::numeric_limits<T>::quiet_NaN(),
  90. std::numeric_limits<T>::has_quiet_NaN);
  91. print_row("s.nan", std::numeric_limits<T>::signaling_NaN(),
  92. std::numeric_limits<T>::has_signaling_NaN);
  93. std::cout << "\n\n";
  94. }
  95. template<class T>
  96. void print_row(const char* name, T val, bool ok)
  97. {
  98. std::cout << std::left << std::setw(10) << name << std::right;
  99. std::cout << std::hex << std::setfill('0');
  100. if(ok) {
  101. if(is_big_endian()) {
  102. for(size_t i = 0; i < sizeof(T); ++i) {
  103. unsigned char c = *(reinterpret_cast<unsigned char*>(&val) + i);
  104. std::cout << std::setw(2)
  105. << static_cast<unsigned int>(c) << ' ';
  106. }
  107. }
  108. else {
  109. for(size_t i = sizeof(T) - 1; i < sizeof(T); --i) {
  110. unsigned char c = *(reinterpret_cast<unsigned char*>(&val) + i);
  111. std::cout << std::setw(2)
  112. << static_cast<unsigned int>(c) << ' ';
  113. }
  114. }
  115. }
  116. else {
  117. for(size_t i = 0; i < sizeof(T); ++i)
  118. std::cout << "-- ";
  119. }
  120. std::cout << '\n';
  121. std::cout << std::dec << std::setfill(' ');
  122. }
  123. /*
  124. Sample output on an AMD Quadcore running MSVC 10
  125. Processor: x86 or x64
  126. This platform is little-endian.
  127. BOOST_LITTTLE_ENDIAN is defined.
  128. ---------- float --------------------
  129. 0 00 00 00 00
  130. sn.min 00 00 00 01
  131. -sn.min 80 00 00 01
  132. n.min/256 00 00 80 00
  133. n.min/2 00 40 00 00
  134. -n.min/2 80 40 00 00
  135. n.min 00 80 00 00
  136. 1 3f 80 00 00
  137. 3/4 3f 40 00 00
  138. 4/3 3f aa aa ab
  139. max 7f 7f ff ff
  140. inf 7f 80 00 00
  141. q.nan 7f c0 00 00
  142. s.nan 7f c0 00 01
  143. ---------- double -------------------
  144. 0 00 00 00 00 00 00 00 00
  145. sn.min 00 00 00 00 00 00 00 01
  146. -sn.min 80 00 00 00 00 00 00 01
  147. n.min/256 00 00 10 00 00 00 00 00
  148. n.min/2 00 08 00 00 00 00 00 00
  149. -n.min/2 80 08 00 00 00 00 00 00
  150. n.min 00 10 00 00 00 00 00 00
  151. 1 3f f0 00 00 00 00 00 00
  152. 3/4 3f e8 00 00 00 00 00 00
  153. 4/3 3f f5 55 55 55 55 55 55
  154. max 7f ef ff ff ff ff ff ff
  155. inf 7f f0 00 00 00 00 00 00
  156. q.nan 7f f8 00 00 00 00 00 00
  157. s.nan 7f f8 00 00 00 00 00 01
  158. ---------- long double --------------
  159. 0 00 00 00 00 00 00 00 00
  160. sn.min 00 00 00 00 00 00 00 01
  161. -sn.min 80 00 00 00 00 00 00 01
  162. n.min/256 00 00 10 00 00 00 00 00
  163. n.min/2 00 08 00 00 00 00 00 00
  164. -n.min/2 80 08 00 00 00 00 00 00
  165. n.min 00 10 00 00 00 00 00 00
  166. 1 3f f0 00 00 00 00 00 00
  167. 3/4 3f e8 00 00 00 00 00 00
  168. 4/3 3f f5 55 55 55 55 55 55
  169. max 7f ef ff ff ff ff ff ff
  170. inf 7f f0 00 00 00 00 00 00
  171. q.nan 7f f8 00 00 00 00 00 00
  172. s.nan 7f f8 00 00 00 00 00 01
  173. */