- #include <iostream> 
- #include <iomanip> 
- #include <limits> 
- #include <math.h> 
- #include <sstream> 
- using namespace std; 
-   
- void test(double value) 
- { 
-     int digits_before = 1 + (int)floor(log10(fabs(value))); 
-     int digits_after = std::numeric_limits<double>::digits10 - digits_before; 
-     double whole = floor(pow(10, digits_after) * fabs(value) + 0.5); 
-     while (digits_after > 0 && (whole/10.0 - floor(whole/10.0)) < 0.05) 
-     { 
-         --digits_after; 
-         whole = floor(whole / 10.0 + 0.5); 
-     } 
-     if (digits_after < 0) digits_after = 0; 
-     std::stringstream ss; 
-     ss << std::fixed << std::setprecision(digits_after) << value; 
-     cout << ss.str() << endl; 
- } 
-   
- int main() { 
- 	test(3.14); 
- 	test(3.14159); 
- 	test(1000); 
- 	test(1000.00000000001); 
- 	test(0.00001); 
- 	test(0.000000000000000000023); 
-     return 0; 
- } 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGxpbWl0cz4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHNzdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIHRlc3QoZG91YmxlIHZhbHVlKQp7CiAgICBpbnQgZGlnaXRzX2JlZm9yZSA9IDEgKyAoaW50KWZsb29yKGxvZzEwKGZhYnModmFsdWUpKSk7CiAgICBpbnQgZGlnaXRzX2FmdGVyID0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCAtIGRpZ2l0c19iZWZvcmU7CiAgICBkb3VibGUgd2hvbGUgPSBmbG9vcihwb3coMTAsIGRpZ2l0c19hZnRlcikgKiBmYWJzKHZhbHVlKSArIDAuNSk7CiAgICB3aGlsZSAoZGlnaXRzX2FmdGVyID4gMCAmJiAod2hvbGUvMTAuMCAtIGZsb29yKHdob2xlLzEwLjApKSA8IDAuMDUpCiAgICB7CiAgICAgICAgLS1kaWdpdHNfYWZ0ZXI7CiAgICAgICAgd2hvbGUgPSBmbG9vcih3aG9sZSAvIDEwLjAgKyAwLjUpOwogICAgfQogICAgaWYgKGRpZ2l0c19hZnRlciA8IDApIGRpZ2l0c19hZnRlciA9IDA7CiAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKICAgIHNzIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oZGlnaXRzX2FmdGVyKSA8PCB2YWx1ZTsKICAgIGNvdXQgPDwgc3Muc3RyKCkgPDwgZW5kbDsKfQoKaW50IG1haW4oKSB7Cgl0ZXN0KDMuMTQpOwoJdGVzdCgzLjE0MTU5KTsKCXRlc3QoMTAwMCk7Cgl0ZXN0KDEwMDAuMDAwMDAwMDAwMDEpOwoJdGVzdCgwLjAwMDAxKTsKCXRlc3QoMC4wMDAwMDAwMDAwMDAwMDAwMDAwMjMpOwogICAgcmV0dXJuIDA7Cn0=