#include <cmath>
#include <iostream>
#include <iomanip>
#include <limits>
#include <sstream>
std::string make_string(double x, int precision)
{
std::ostringstream output;
output << std::setprecision(precision) << x;
return output.str();
}
int digits_before_point(double x)
{
return x ? int(floor(std::log(std::abs(x)) / std::log(10.0) + 1)) : 0;
}
std::string format(double x, int precision = 2)
{
const auto dbp = digits_before_point(x);
if (dbp + precision > 0)
{
return make_string(x, dbp + precision);
}
else if (dbp + precision == 0)
{
const double min_value = std::exp(-precision * std::log(10));
if (x >= min_value / 2)
{
return make_string(min_value, 1);
}
else if(x <= -min_value / 2)
{
return make_string(-min_value, 1);
}
}
return "0";
}
int main()
{
std::cout << format(-123456.949) << std::endl;
std::cout << format(-123456.004) << std::endl;
std::cout << format(-123456.005) << std::endl;
std::cout << format(-123456.) << std::endl;
std::cout << format(0) << std::endl;
std::cout << format(0.9499) << std::endl;
std::cout << format(0.0049999) << std::endl;
std::cout << format(0.005) << std::endl;
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8c3N0cmVhbT4KCnN0ZDo6c3RyaW5nIG1ha2Vfc3RyaW5nKGRvdWJsZSB4LCBpbnQgcHJlY2lzaW9uKQp7CglzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0cHV0OwoJb3V0cHV0IDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHByZWNpc2lvbikgPDwgeDsKCXJldHVybiBvdXRwdXQuc3RyKCk7Cn0KCmludCBkaWdpdHNfYmVmb3JlX3BvaW50KGRvdWJsZSB4KQp7CglyZXR1cm4geCA/IGludChmbG9vcihzdGQ6OmxvZyhzdGQ6OmFicyh4KSkgLyBzdGQ6OmxvZygxMC4wKSArIDEpKSA6IDA7Cn0KCnN0ZDo6c3RyaW5nIGZvcm1hdChkb3VibGUgeCwgaW50IHByZWNpc2lvbiA9IDIpCnsKCWNvbnN0IGF1dG8gZGJwID0gZGlnaXRzX2JlZm9yZV9wb2ludCh4KTsKCWlmIChkYnAgKyBwcmVjaXNpb24gPiAwKQoJewoJCXJldHVybiBtYWtlX3N0cmluZyh4LCBkYnAgKyBwcmVjaXNpb24pOwoJfQoJZWxzZSBpZiAoZGJwICsgcHJlY2lzaW9uID09IDApCgl7CgkJY29uc3QgZG91YmxlIG1pbl92YWx1ZSA9IHN0ZDo6ZXhwKC1wcmVjaXNpb24gKiBzdGQ6OmxvZygxMCkpOwoJCWlmICh4ID49IG1pbl92YWx1ZSAvIDIpCgkJewoJCQlyZXR1cm4gbWFrZV9zdHJpbmcobWluX3ZhbHVlLCAxKTsKCQl9CgkJZWxzZSBpZih4IDw9IC1taW5fdmFsdWUgLyAyKQoJCXsKCQkJcmV0dXJuIG1ha2Vfc3RyaW5nKC1taW5fdmFsdWUsIDEpOwoJCX0KCX0KCXJldHVybiAiMCI7Cn0KCmludCBtYWluKCkKewoJc3RkOjpjb3V0IDw8IGZvcm1hdCgtMTIzNDU2Ljk0OSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGZvcm1hdCgtMTIzNDU2LjAwNCkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGZvcm1hdCgtMTIzNDU2LjAwNSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGZvcm1hdCgtMTIzNDU2LikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGZvcm1hdCgwKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgZm9ybWF0KDAuOTQ5OSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGZvcm1hdCgwLjAwNDk5OTkpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBmb3JtYXQoMC4wMDUpIDw8IHN0ZDo6ZW5kbDsKfQ==