#include #include //for setprecision #include #include //for numeric_limits #include //for log10, floor using namespace std; //Number of bits in the mantissa in type T. template int mantissa(); template <> inline int mantissa() {return 24;} template <> inline int mantissa() {return 53;} template <> inline int mantissa() {return 113;} //Number of significant decimal digits that will fit in type T. template inline int significant() { return floor(log10(pow(2.0, mantissa()))); } template void print(T t) { const streamsize prec = cout.precision(); //Save the precision. cout << setprecision(significant()) << t << "\n" << setprecision(prec); //Restore the precision. } int main() { float f = 1.0f / 3.0f; double d = 1.0 / 3.0; long double ld = 1.0L / 3.0L; cout << setprecision(35) << f << "\n" << d << "\n" << ld << "\n\n"; print(f); print(d); print(ld); return EXIT_SUCCESS; } /* Output: 0.3333333432674407958984375 0.33333333333333331482961625624739099 0.33333333333333333333333333333333332 0.3333333 0.333333333333333 0.3333333333333333333333333333333333 */