C ++ функция std :: pow () возвращает inf вместо значения - PullRequest
0 голосов
/ 07 ноября 2018

У меня проблема с возвращаемым значением на std::pow(). В основном, у меня есть следующая строка в коде:

#include <cmath>
int main()
{
     double rate = 1.0033333333333334;
     int m = 360;
     unsigned int period = 1;
     double res = std::pow(rate, -(m-period+1));
}

И res имеет значение inf. Однако, когда я вставляю std::pow(rate, -(m-period+1)) в часы Visual Studio во время отладки, он имеет правильное значение 0.30179586515268314. Кто-нибудь знает, что является источником этого несоответствия?

См. http://coliru.stacked -crooked.com / a / ec78c5172cf53e03

1 Ответ

0 голосов
/ 07 ноября 2018

Ваша проблема связана с -(m-period+1) частью вашего звонка на pow. period объявлено как

unsigned int period = 1;

так что когда

-(m-period+1)

оценивается у вас

   -(int - unsigned int + int)
== -(unsigned int)

так что вы получаете 360 как unsigned int, и когда вы отрицаете его, оно оборачивается и становится очень большим числом (4294966936 для 32-битного int). Это означает, что вы делаете

1.0033333333333334 ^ 4294966936

не

1.0033333333333334 ^ -360

Вам либо нужно сделать period и int, чтобы получить правильные результаты.


Если у вас есть число, которое не должно быть отрицательным, не используйте тип без знака. Ничто в unsigned не останавливает отрицательные числа, оно просто превращает их в положительные числа. Если вы хотите убедиться, что число не является отрицательным, используйте тип со знаком и оператор if.

...