Необходимо определить, является ли логарифм a по основанию b целым.
Мое решение:
cout<<fmod(log(a)/log(b),1);
Но, например, при тесте a=46656 b=6, программа выдает 8.88178e-016, вместо ожидаемого 0.
Как это можно исправить / реализовать другим способом?
Asked
Active
Viewed 147 times
1
Qwertiy
- 123,725
TrueRacoon
- 65
-
1
- http://ru.stackoverflow.com/q/50492/178988 2. http://ru.stackoverflow.com/q/399420/178988 3. http://ru.stackoverflow.com/q/461464/178988
– Qwertiy Jan 11 '17 at 16:42 -
Хотя в данном вопросе, возможно, следует поступить вообще по-другому. – Qwertiy Jan 11 '17 at 16:44
-
Для целых значений - просто возведите в степень и проверьте... – Harry Jan 11 '17 at 16:48
1 Answers
3
Логарифм является целым тогда и только тогда, когда число является степенью основания.
Операции с дробными числами вносят в вычисления погрешность, поэтому, если по условию даны целые числа (в смысле, они хранятся в целочисленных переменных), то имеет смысл не жалеть 32 операции чтобы просто проверить соответствующие степени:
bool check(unsigned a, unsigned b)
{
unsigned x;
for (x=1; x<a; x*=b);
return x==a;
}
При необходимости стоит подумать о переполнении.
Qwertiy
- 123,725