#include <cmath>
#include <iostream>
#include <iomanip>
#include <limits>
using namespace std;
void f(const uint64_t n) {
const auto d = static_cast<double>(n);
const long double ld = n;
cout << "Original: " << n << endl << setprecision(50);
if(ld == d) {
cout << "Lower bound: " << d << "\nUpper bound: " << d << "\nPrecision loss: " << 0.0 << "\n\n";
} else if(ld < d) {
const double f = nextafter(d, -numeric_limits<double>::infinity());
cout << "Lower bound: " << f << "\nUpper bound: " << d << "\nPrecision loss: " << abs(d - f) << "\n\n";
} else {
const double f = nextafter(d, numeric_limits<double>::infinity());
cout << "Lower bound: " << d << "\nUpper bound: " << f << "\nPrecision loss: " << abs(d - f) << "\n\n";
}
}
int main() {
f(numeric_limits<uint64_t>::max()); // Rounds up
f(numeric_limits<uint64_t>::max() - 2046); // Rounds down
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8bGltaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgZihjb25zdCB1aW50NjRfdCBuKSB7CiAgY29uc3QgYXV0byBkID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihuKTsKICBjb25zdCBsb25nIGRvdWJsZSBsZCA9IG47CiAgCiAgY291dCA8PCAiT3JpZ2luYWw6ICAgICAgICAgICIgPDwgbiA8PCBlbmRsIDw8IHNldHByZWNpc2lvbig1MCk7CiAgCiAgaWYobGQgPT0gZCkgewogIAljb3V0IDw8ICJMb3dlciBib3VuZDogICAgICAgIiA8PCBkIDw8ICJcblVwcGVyIGJvdW5kOiAgICAgICAiIDw8IGQgPDwgIlxuUHJlY2lzaW9uIGxvc3M6ICAgICIgPDwgMC4wIDw8ICJcblxuIjsKICB9IGVsc2UgaWYobGQgPCBkKSB7CiAgICBjb25zdCBkb3VibGUgZiA9IG5leHRhZnRlcihkLCAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CiAgCQogIAljb3V0IDw8ICJMb3dlciBib3VuZDogICAgICAgIiA8PCBmIDw8ICJcblVwcGVyIGJvdW5kOiAgICAgICAiIDw8IGQgPDwgIlxuUHJlY2lzaW9uIGxvc3M6ICAgICIgPDwgYWJzKGQgLSBmKSA8PCAiXG5cbiI7CiAgfSBlbHNlIHsKICAgIGNvbnN0IGRvdWJsZSBmID0gbmV4dGFmdGVyKGQsIG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOwogIAkKICAJY291dCA8PCAiTG93ZXIgYm91bmQ6ICAgICAgICIgPDwgZCA8PCAiXG5VcHBlciBib3VuZDogICAgICAgIiA8PCBmIDw8ICJcblByZWNpc2lvbiBsb3NzOiAgICAiIDw8IGFicyhkIC0gZikgPDwgIlxuXG4iOwogIAkKICB9Cn0KCmludCBtYWluKCkgewogIGYobnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSk7ICAgICAgICAgLy8gUm91bmRzIHVwCiAgZihudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpIC0gMjA0Nik7ICAvLyBSb3VuZHMgZG93bgp9