// test // MSVC 7.0 static const double not allowed in templates! // Posted request for help 16 Oct 2002 #include #include #include "template_interval_constants.hpp" // for smallest interval containing pi. using std::cout; using std::cin; using std::endl; using std::dec; using std::hex; using std::boolalpha; using std::string; using std::setprecision; using std::setw; using NTL::PrecisionOK; const char nl = '\n'; const char tab = '\t'; const char space = ' '; int main() { cout << "Test " << __FILE__ << space << __TIMESTAMP__ << endl; // Ensure all significant decimal digits are output. // Calculated from the number of mantissa or significand binary digits, // given by std::numeric_limits::digits, typically 24, 53, 60, or 113. // NB difference between singificant and significand! int float_significand_digits = std::numeric_limits::digits; // 24 bits int float_significant_digits = 2 + std::numeric_limits::digits * 30101/100000; int double_significand_digits = std::numeric_limits::digits; // 53 bits int double_significant_digits = 2 + std::numeric_limits::digits * 30101/100000; // 53 bits for MSVC int long_double_significand_digits = std::numeric_limits::digits; // also 53 for MSVC, // but 64 for GCC long double, 128 for Sparc ... int long_double_significant_digits = std::numeric_limits::digits * 30101/100000; // would be same as double on MSVC, so don't always use this. // 64 for Extended double precision X86 80 bit (double only 53). cout << "std::numeric_limits::digits = " << double_significand_digits << endl; cout << "double significant digits = " << double_significant_digits << endl; cout << nl << "float significant digits = " << float_significant_digits << endl; cout.precision(float_significant_digits); cout << "pi::lower() " << pi::lower() << endl; cout << "pi::nearest() " << pi::nearest() << endl; cout << "pi::upper() " << pi::upper() << endl; check_interval_values(pi::lower(), pi::nearest(), pi::upper() ); cout << nl << "double significant digits = " << double_significant_digits << endl; cout.precision(double_significant_digits); cout << "pi::lower() " << pi::lower() << endl; cout << "pi::nearest() " << pi::nearest() << endl; cout << "pi::upper() " << pi::upper() << endl; // Using the builtin long double precision cout << nl << "long double significant digits = " << long_double_significant_digits << endl; cout.precision(long_double_significant_digits); cout << "pi::lower() " << pi::lower() << endl; cout << "pi::nearest() " << pi::nearest() << endl; cout << "pi::upper() " << pi::upper() << endl; // Picking a different specialization for X86 double extended precision. long_double_significand_digits = 64; // Extended double precision X86 80 bit (double only 53). cout << nl << "X86 extended long double std::numeric_limits::digits = " << long_double_significand_digits << endl; long_double_significant_digits = 2 + long_double_significand_digits * 30101/100000; cout << "X86 extended long double significant digits = " << long_double_significant_digits << endl; cout.precision(long_double_significant_digits); cout << "pi::lower() " << pi::lower() << endl; cout << "pi::nearest() " << pi::nearest() << endl; cout << "pi::upper() " << pi::upper() << endl; // Example of a non-floating point type - not very practical approx to pi! cout << nl << "pi::lower() " << pi::lower() << endl; cout << "pi::nearest() " << pi::nearest() << endl; cout << "pi::upper() " << pi::upper() << endl; // cout << "pi::lower() " << pi::lower() << endl; // Fails to compile because no specialisation for type byte. // Example of a user defined floating point type. int quad_float_significand_digits = 106; // 53 + 53 int quad_float_significant_digits = 2 + quad_float_significand_digits * 30101/100000; // 33 cout << nl << "quad_float significand digits = " << quad_float_significand_digits << endl; cout << "quad_float significant digits = " << quad_float_significant_digits << endl; quad_float::SetOutputPrecision(quad_float_significant_digits); // significant decimal digits. cout << (PrecisionOK() ? "quad_float::SetOutputPrecision OK\n" : "quad_float::SetOutputPrecision not OK!\n"); cout.precision(quad_float_significant_digits); // ineffective for quad_float - use SetOutputPrecision. cout << nl << cout.precision() << endl; // 33 cout << "pi::lower() " << pi::lower() << endl; cout << "pi::nearest() " << pi::nearest() << endl; cout << "pi::upper() " << pi::upper() << endl; return 0; } // main /* Test test_template_interval_constants.cpp Wed Oct 16 20:43:35 2002 std::numeric_limits::digits = 53 double significant digits = 17 float significant digits = 9 pi::lower() 3.1415925 pi::nearest() 3.14159274 pi::upper() 3.14159274 nearest is upper limit. double significant digits = 17 pi::lower() 3.1415926535897931 pi::nearest() 3.1415926535897931 pi::upper() 3.1415926535897936 long double significant digits = 15 pi::lower() 3.14159265358979 pi::nearest() 3.14159265358979 pi::upper() 3.14159265358979 X86 extended long double std::numeric_limits::digits = 64 X86 extended long double significant digits = 21 pi::lower() 3.1415926535897931 pi::nearest() 3.1415926535897931 pi::upper() 3.1415926535897931 pi::lower() 3 pi::nearest() 3 pi::upper() 4 quad_float significand digits = 106 quad_float significant digits = 33 quad_float::SetOutputPrecision OK 33 pi::lower() 3.14159265358979323846264338327948 pi::nearest() 3.14159265358979323846264338327951 pi::upper() 3.14159265358979323846264338327951 Press any key to continue */