// test lexical_cast for changes in stream precision for more decimal digits. #ifdef _MSC_VER #if (_MSC_VER == 1310) #pragma message("MSVC++ compiler Version 7.1") char* const compilerID = "MSVC++ compiler Version 7.1"; #endif #else char* const compilerID = "?"; #endif #include #include #include #include #include "lexical_cast.hpp" using std::cout; using std::endl; using std::string; using std::setprecision; using boost::lexical_cast; int main() { cout << "Test "; #if defined(__FILE__) && defined(__TIMESTAMP__) cout << " " << __FILE__ << ' ' << __TIMESTAMP__ << endl; #endif cout << compilerID << endl; int const float_significant_digits10 = 2 + std::numeric_limits::digits * 301/1000; int const double_significant_digits10 = 2 + std::numeric_limits::digits * 301/1000; int const long_double_significant_digits10 = 2 + std::numeric_limits::digits * 301/1000; float const sqrt2F = 1.41421356237309504880168872420969807857F; // sqrt(2); double const sqrt2 = 1.41421356237309504880168872420969807857; // sqrt(2); long double const sqrt2L = 1.41421356237309504880168872420969807857L; // sqrt(2); cout << setprecision(float_significant_digits10) << sqrt2F << endl; // 1.41421354 9 significant decimal digits. string sf = lexical_cast(sqrt2F); cout << sf << endl; // 1.41421354 9 significant decimal digits. float ff = lexical_cast(sf); // Convert string back to float. cout << setprecision(float_significant_digits10) << ff << endl; // 1.41421354 9 significant decimal digits. if (ff != sqrt2F) { cout << "ff != sqrt2F!" << endl; } string sd = lexical_cast(sqrt2); cout << sd << endl; // 1.4142135623730951 17 significant decimal digits. double dd = lexical_cast(sd); // Convert string back to double. cout << setprecision(double_significant_digits10) << dd << endl; // 1.4142135623730951 17 significant decimal digits if (dd != sqrt2) { cout << "dd != sqrt2" << endl; } string sl = lexical_cast(sqrt2L); cout << sl << endl; // 1.4142135623730951 17 significant decimal digits. // But other compilers provide a longer long double. long double ld = lexical_cast(sl); // Convert string back to long double. cout << setprecision(long_double_significant_digits10) << ld << endl; // if (ld != sqrt2L) { cout << "ld != sqrt2L" << endl; } return 0; } // int main() /* Boost release 30 outputs: Test .\test_lexical_cast.cpp Sat Aug 9 17:33:12 2003 MSVC++ compiler Version 7.1 1.41421354 1.414214 1.41421402 ff != sqrt2F! 1.414213562373095 1.4142135623730949 dd != sqrt2 1.414213562373095 1.4142135623730949 ld != sqrt2L Press any key to continue Revised version outputs: Test .\test_lexical_cast.cpp Sat Aug 9 17:35:21 2003 MSVC++ compiler Version 7.1 1.41421354 1.41421354 1.41421354 1.4142135623730951 1.4142135623730951 1.4142135623730951 1.4142135623730951 Press any key to continue */