Extracting integer and fractional parts of a real number

Started by
1 comment, last by hkBattousai 13 years, 4 months ago
I wrote a method for finding integer and fractional parts of a number. Unfortunately, it doesn't look like to be working for negative numbers. Can you please tell me what I'm doing wrong?

Method:
void Math::GetIntegerAndFractionalParts(long double num,					uint64_t & integer,					long double & fraction){	integer = static_cast<uint64_t>(num);	fraction = num - static_cast<long double>(integer);}


Usage example:
long double num = 1.23;long double frac;uint64_t intg;Math::GetIntegerAndFractionalParts(num, intg, frac);std::cout << "Number       : " << num  << std::endl;std::cout << "Integer part : " << intg << std::endl;std::cout << "Fractional   : " << frac << std::endl << std::endl;num = -1.23;Math::GetIntegerAndFractionalParts(num, intg, frac);std::cout << "Number       : " << num  << std::endl;std::cout << "Integer part : " << intg << std::endl;std::cout << "Fractional   : " << frac << std::endl << std::endl;num = -567.89;Math::GetIntegerAndFractionalParts(num, intg, frac);std::cout << "Number       : " << num  << std::endl;std::cout << "Integer part : " << intg << std::endl;std::cout << "Fractional   : " << frac << std::endl << std::endl;num = Math::E;		// Natural logarithm baseMath::GetIntegerAndFractionalParts(num, intg, frac);std::cout << "Number       : " << num  << std::endl;std::cout << "Integer part : " << intg << std::endl;std::cout << "Fractional   : " << frac << std::endl << std::endl;


Output:
Number       : 1.23Integer part : 1Fractional   : 0.23Number       : -1.23Integer part : 18446744073709551615Fractional   : -1.84467e+019Number       : -567.89Integer part : 18446744073709551049Fractional   : -1.84467e+019Number       : 2.71828Integer part : 2Fractional   : 0.718282
Advertisement
You're casting to uint64_t. The "u" stands for "unsigned", meaning that it can't do negative numbers. Try casting to int64_t instead.
Quote:Original post by kuroioranda
You're casting to uint64_t. The "u" stands for "unsigned", meaning that it can't do negative numbers. Try casting to int64_t instead.

Ouu, I feel stupid at times like this...
Thank you very much.

This topic is closed to new replies.

Advertisement