I’m trying to read in two numbers, and display the absolute difference between them. The numbers get ridiculously large, so I had to switch from LONG to LONG DOUBLE and just display them with 0 precision on the decimal. My issue is that with the number listed in the subject, when I scan it into a long double from a string’s c_str either in the scan the last digit is being dropped, or more likely the display of the long double is dropping it.
9223372036854775807 – 1 should be 9223372036854775806 but instead it’s displaying 9223372036854775800, and when I stop to inspect the long double with the 9223372036854775807 in it, it just shows me “9.2233720368547758e+018”
I would blame this all on a 2 bit processor, but it seems on a 64 bit it’s still printing the wrong answer. Has anyone got any way to preserve the entire number?
my includes are stripped of characters that seemed to be messing with the html parser.
#include iostream
#include string
#include math.h
using namespace std;
int main () {
string line;
std::getline(std::cin, line);
while ( std::cin )
{
long double n, m, o;
sscanf ((char *)line.c_str(),"%Lf %Lf",&n, &m);
if(n>=m)
{
o = n - m;
}
else
{
o = m-n;
}
char buffer[100000];
sprintf( buffer , "%0.0Lf\0", o);
cout << buffer << endl;
std::getline(std::cin, line);
}
return 0;
}
I would stop using
long doubleand uselong longif your compiler supports it. You said you had previously been usinglongso I don’t think you were storing fractional parts; if that is correct, thenlong longwould be what you want, notlong double. I tested your code withlong longon MSVC++ 2010 and it gave the expected output.And as Mysticial noted,
doubleis the same aslong doubleon many compilers today.