#include <iostream>
#include <limits>
#include <iomanip>
template<class T>
struct accurate_proxy
{
T value;
};
template<class T>
std::ostream& operator<<(std::ostream& os, accurate_proxy<T> const& x)
{
std::ios::fmtflags oldflags = os.flags();
if ((oldflags & std::ios::floatfield)==std::ios::fixed)
os.setf(std::ios::fmtflags(0),std::ios::floatfield);
std::streamsize oldpres = os.precision();
os.precision(std::numeric_limits<T>::digits+3);
os << x.value;
os.precision(oldpres);
os.flags(oldflags);
return os;
}
template<class T>
accurate_proxy<T> accurate(T const& x)
{
accurate_proxy<T> result = {x};
return result;
}
int main()
{
std::cout << accurate(0.1f) << std::endl;
std::cout << accurate(0.1) << std::endl;
std::cout << accurate(0.1L) << std::endl;
std::cout << 0.1 << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8aW9tYW5pcD4KCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBhY2N1cmF0ZV9wcm94eQp7CiAgICBUIHZhbHVlOwp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGFjY3VyYXRlX3Byb3h5PFQ+IGNvbnN0JiB4KQp7CiAgICBzdGQ6Omlvczo6Zm10ZmxhZ3Mgb2xkZmxhZ3MgPSBvcy5mbGFncygpOwogICAgaWYgKChvbGRmbGFncyAmIHN0ZDo6aW9zOjpmbG9hdGZpZWxkKT09c3RkOjppb3M6OmZpeGVkKQogICAgICAgIG9zLnNldGYoc3RkOjppb3M6OmZtdGZsYWdzKDApLHN0ZDo6aW9zOjpmbG9hdGZpZWxkKTsKICAgIHN0ZDo6c3RyZWFtc2l6ZSBvbGRwcmVzID0gb3MucHJlY2lzaW9uKCk7CiAgICBvcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxUPjo6ZGlnaXRzKzMpOwogICAgb3MgPDwgeC52YWx1ZTsKICAgIG9zLnByZWNpc2lvbihvbGRwcmVzKTsKICAgIG9zLmZsYWdzKG9sZGZsYWdzKTsKICAgIHJldHVybiBvczsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4KYWNjdXJhdGVfcHJveHk8VD4gYWNjdXJhdGUoVCBjb25zdCYgeCkKewogICAgYWNjdXJhdGVfcHJveHk8VD4gcmVzdWx0ID0ge3h9OwogICAgcmV0dXJuIHJlc3VsdDsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgYWNjdXJhdGUoMC4xZikgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IGFjY3VyYXRlKDAuMSkgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IGFjY3VyYXRlKDAuMUwpIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAwLjEgPDwgc3RkOjplbmRsOwp9Cg==