#include <iostream>
#include <iomanip>
int main() {
long long int i=10000000000000;
float f=100000000000000.0;
auto x = i*f; // does not account for expected change of scale
std::cout <<"Type "<< typeid(x).name() <<": "
<<std::fixed <<std::setw(30) << x << std::endl;
long double y = i*(long double)f; // without casting, same as before
std::cout <<"Type "<< typeid(y).name() <<": "
<<std::fixed <<std::setw(30) <<y << std::endl;
// remaining rounding error is because of the initial float.
// Correcting the original variable with long double and using auto gives better result !!!
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCmludCBtYWluKCkgewogICAgbG9uZyBsb25nIGludCBpPTEwMDAwMDAwMDAwMDAwOwogICAgZmxvYXQgZj0xMDAwMDAwMDAwMDAwMDAuMDsKICAgIAogICAgYXV0byB4ID0gaSpmOyAgIC8vIGRvZXMgbm90IGFjY291bnQgZm9yIGV4cGVjdGVkIGNoYW5nZSBvZiBzY2FsZQogICAgc3RkOjpjb3V0IDw8IlR5cGUgIjw8IHR5cGVpZCh4KS5uYW1lKCkgPDwiOiAiCiAgICAgICA8PHN0ZDo6Zml4ZWQgPDxzdGQ6OnNldHcoMzApICA8PCB4ICA8PCBzdGQ6OmVuZGw7CiAgICAgICAKICAgIGxvbmcgZG91YmxlIHkgPSBpKihsb25nIGRvdWJsZSlmOyAvLyB3aXRob3V0IGNhc3RpbmcsIHNhbWUgYXMgYmVmb3JlICAKICAgIHN0ZDo6Y291dCA8PCJUeXBlICI8PCB0eXBlaWQoeSkubmFtZSgpIDw8IjogIgogICAgICAgPDxzdGQ6OmZpeGVkIDw8c3RkOjpzZXR3KDMwKSAgIDw8eSAgPDwgc3RkOjplbmRsOwogICAgICAgLy8gcmVtYWluaW5nIHJvdW5kaW5nIGVycm9yIGlzIGJlY2F1c2Ugb2YgdGhlIGluaXRpYWwgZmxvYXQuICAKICAgICAgIC8vIENvcnJlY3RpbmcgdGhlIG9yaWdpbmFsIHZhcmlhYmxlIHdpdGggbG9uZyBkb3VibGUgYW5kIHVzaW5nIGF1dG8gZ2l2ZXMgYmV0dGVyIHJlc3VsdCAhISEKfQ==