#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <cassert>
std::string format(double x, int precision = 2)
{
std::ostringstream output;
output << std::fixed << std::setprecision(precision) << x;
std::string s = output.str();
if (precision > 0)
{
const auto pos = s.find_last_not_of('0');
assert(pos != std::string::npos);
if (pos != s.size() - 1)
{
const auto count = s[pos] != '.' ? pos + 1 : pos;
return s.substr(0, count);
}
}
return s;
}
int main()
{
std::cout << format(0) << std::endl;
std::cout << format(1e-20) << std::endl;
std::cout << format(1e+20) << std::endl;
std::cout << format(123456.0049999) << std::endl;
std::cout << format(123456.005) << std::endl;
std::cout << format(123456.695) << std::endl;
std::cout << format(0x1.6bcc41e8ffffap+46) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjYXNzZXJ0PgoKc3RkOjpzdHJpbmcgZm9ybWF0KGRvdWJsZSB4LCBpbnQgcHJlY2lzaW9uID0gMikKewoJc3RkOjpvc3RyaW5nc3RyZWFtIG91dHB1dDsKCW91dHB1dCA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHByZWNpc2lvbikgPDwgeDsKCXN0ZDo6c3RyaW5nIHMgPSBvdXRwdXQuc3RyKCk7CgoJaWYgKHByZWNpc2lvbiA+IDApCgl7CgkJY29uc3QgYXV0byBwb3MgPSBzLmZpbmRfbGFzdF9ub3Rfb2YoJzAnKTsKCQlhc3NlcnQocG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKTsJCQoKCQlpZiAocG9zICE9IHMuc2l6ZSgpIC0gMSkKCQl7CgkJCWNvbnN0IGF1dG8gY291bnQgPSBzW3Bvc10gIT0gJy4nID8gcG9zICsgMSA6IHBvczsKCQkJcmV0dXJuIHMuc3Vic3RyKDAsIGNvdW50KTsKCQl9Cgl9CglyZXR1cm4gczsKfQoKaW50IG1haW4oKQp7CglzdGQ6OmNvdXQgPDwgZm9ybWF0KDApIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBmb3JtYXQoMWUtMjApIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBmb3JtYXQoMWUrMjApIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBmb3JtYXQoMTIzNDU2LjAwNDk5OTkpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBmb3JtYXQoMTIzNDU2LjAwNSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGZvcm1hdCgxMjM0NTYuNjk1KSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgZm9ybWF0KDB4MS42YmNjNDFlOGZmZmZhcCs0NikgPDwgc3RkOjplbmRsOwp9