Я пишу функцию, в которой мне приходится вычислять факторные числа и делать операции над ними. Возвращаемое значение функции должно быть длинным, поэтому я думаю, что было бы лучше делать все операции в длинном длинном формате. Если я ошибаюсь, исправьте меня.tgamma() long long typecasting
Функция tgamma() сама по себе возвращает правильное значение в научной нотации. Но значение, возвращаемое tgamma(), иногда на 1 меньше фактического ответа, когда значение, возвращаемое функцией, приписывается как «long long».
int main()
{
std::cout<<"11!:"<<tgamma(12)<<std::endl;
std::cout<<"12!"<<tgamma(13)<<std::endl;
std::cout<<"13!"<<tgamma(14)<<std::endl;
std::cout<<"14!"<<tgamma(15)<<std::endl;
std::cout<<"15!"<<tgamma(16)<<std::endl;
std::cout<<"16!"<<tgamma(17)<<std::endl;
std::cout<<"********************************"<<std::endl;
std::cout<<"11!:"<<(long long)tgamma(12)<<std::endl;
std::cout<<"12!"<<(long long)tgamma(13)<<std::endl;
std::cout<<"13!"<<(long long)tgamma(14)<<std::endl;
std::cout<<"14!"<<(long long)tgamma(15)<<std::endl;
std::cout<<"15!"<<(long long)tgamma(16)<<std::endl;
std::cout<<"16!"<<(long long)tgamma(17)<<std::endl;
return 0;
}
Я получаю следующий вывод:
11!:3.99168e+07
12!4.79002e+08
13!6.22702e+09
14!8.71783e+10
15!1.30767e+12
16!2.09228e+13
********************************
11!:39916800
12!479001599
13!6227020799
14!87178291199
15!1307674367999
16!20922789888000
Фактическое значение 15! в соответствии с this site является 1307674368000, но когда я привожу tgamma (16) в длинный, я получаю только 1307674367999. Дело в том, что это несоответствие появляется только для некоторых чисел. Признанный ответ за 16! является правильным - 20922789888000.
Эта функция предназначена для конкурентной проблемы программирования, которая в настоящее время продолжается, поэтому я не могу вставить функцию и решение, которое я здесь разрабатываю.
Я бы бросил свою собственную факториальную функцию, но я хочу уменьшить количество символов в моей программе, чтобы получить бонусные очки.
Любые советы о том, как обнаружить это несоответствие в приведённой стоимости и исправить его? Или, может быть, какая-то другая функция, которую я могу использовать?
tgamma работает с числами с плавающей запятой, что может потерять точность. Почему бы вам просто не написать свою собственную факториальную функцию с помощью целых чисел? – jtbandes
«Функция tgamma() сама по себе возвращает правильное значение в научной нотации». - Нет, это не так. C++ имеет чистый дизайн. Значение возвращается как двоичное значение. Научная нотация - текстовый формат, который может применяться при преобразовании двоичного значения в текст. – MSalters