fork download
  1. #include <iostream>
  2. #include <limits>
  3. #include <iomanip>
  4.  
  5. template<class T>
  6. struct accurate_proxy
  7. {
  8. T value;
  9. };
  10.  
  11. template<class T>
  12. std::ostream& operator<<(std::ostream& os, accurate_proxy<T> const& x)
  13. {
  14. std::ios::fmtflags oldflags = os.flags();
  15. if ((oldflags & std::ios::floatfield)==std::ios::fixed)
  16. os.setf(std::ios::fmtflags(0),std::ios::floatfield);
  17. std::streamsize oldpres = os.precision();
  18. os.precision(std::numeric_limits<T>::digits+3);
  19. os << x.value;
  20. os.precision(oldpres);
  21. os.flags(oldflags);
  22. return os;
  23. }
  24.  
  25. template<class T>
  26. accurate_proxy<T> accurate(T const& x)
  27. {
  28. accurate_proxy<T> result = {x};
  29. return result;
  30. }
  31.  
  32. int main()
  33. {
  34. std::cout << accurate(0.1f) << std::endl;
  35. std::cout << accurate(0.1) << std::endl;
  36. std::cout << accurate(0.1L) << std::endl;
  37. std::cout << 0.1 << std::endl;
  38. }
  39.  
Success #stdin #stdout 0s 2852KB
stdin
Standard input is empty
stdout
0.100000001490116119384765625
0.1000000000000000055511151231257827021181583404541015625
0.1000000000000000000013552527156068805425093160010874271392822265625
0.1