### Declaration - Calculation?

When I try to execute this program, I get 1 as o/p which is obviously correct.
 ``1234567891011`` ``````#include void main() { long double x=400; x*=400; x/=400; if(x==400) cout<<"1"; else cout<<"2"; }``````

But when i try to calculate the whole thing for var "x" in its declaration, it prints 2.
`long double x=400*400/400;`
gives
 `2`

Actually it prints "2" for any calculation whose result will contain more than 6 digits (i guess). Can anyone tell me why? I really don't seem to get it given I've been using long double..it's range is supposed to be more than just 6 digits, right?
Have you tried just printing out the result of the calculation to see what is it? That would have been a quicker way to find out what was going on than writing a question here and waiting to see if someone answers.
Last edited on
The type of `400*400/400` and all its sub-expressions are int. It is not until it is assigned to x that it gets value `long double`.
Just to illustrate Peter87's point in code form...

 ``1234567891011`` ``````#include #include int main( int argc, char* argv[] ) { std::cout << "Type of calc is " << typeid( 400*400/400 ).name() << std::endl; long double ld = 400 * 400 / 400; std::cout << "Type of ld is " << typeid( ld ).name() << std::endl; return 0; }``````

Output
 ```Type of calc is int Type of ld is long double ```
still why doesn't the value of that int expression evaluate to 400? Does its value change on being assigned to a long double variable?
Not sure about that. This evaluates fine for me...

 ``12345678910`` ``````#include int main( int argc, char* argv[] ) { long double x = 400 * 400 / 400; std::cout << "x " << ( x == 400 ? "is " : "is not " ) << "400\n"; return 0; }``````
works as expected for me as well (VS 2010 premium).
> Peter87: The type of 400*400/400 and all its sub-expressions are int.

+1

> abhishekm71: still why doesn't the value of that int expression evaluate to 400?

There is a big clue here:
"Actually it prints "2" for any calculation whose result will contain more than 6 digits (i guess)"

There is an integer overflow; the program is being run on an implementation with 16-bit `int`
ie. `std::numeric_limits<unsigned int>::digits == 16`

Try this:
 ``12345678`` ``````#include #include int main () { long double x = std::int16_t(400*400) / 400 ; std::cout << x << '\n' ; }``````
Or, more appropriately put the decimals in like C++ really wants you to.

`long double x=400.0*400.0/400.0;`
oh wow! couldn't guess it was a case of integer overflow.

thanks Peter87 and JLBorges
Ah, thanks a lot, everyone.
That really helped.
Topic archived. No new replies allowed.