Рекурсивная проверка работоспособности функции мощности - PullRequest
0 голосов
/ 09 мая 2020

Это своего рода необычный вопрос, но я работаю над проблемой, и моя проблема в том, что он работает. Но только когда я запускаю его, а не когда он проходит через процесс отправки. Я написал эту функцию для обработки показателей с помощью рекурсии (требование задачи).

double Pow(double num, int power) {  
   if (num == 1.0 || power == 0){
      return 1.0;
   } else if ( power > 0){
      return (num * Pow( num, power - 1 ) );
   } else{
      return ( (1.0/num) * Pow( num, power + 1 ) );
   } 
}

Когда я отправляю код, он не проходит каждый модульный тест. При ручном вводе значений, используемых в модульных тестах, он дает правильный результат, поэтому я понятия не имею, что мне нужно исправить. Есть ли в моем журнале ошибка c Я здесь не вижу?

(Единичные тесты, которые не проходят, - -10 ^ -3 и -10 ^ -4)

EDIT- Для ясности здесь показано именно то, что отображается после отправки:

Test -10.0 -4
Test feedback: Your function did not return 0.0001

Test -10.0 -3
Test feedback: Your function did not return -0.001

Он не сообщает мне, что функция вернула, и я не могу увидеть, как проводятся модульные тесты. Настоящая проблема заключается в том, что когда я пытаюсь воспроизвести сбой, я получаю правильный результат (путем жесткого кодирования вызова функции Pow (-10.0, -4) и Pow (-10.0, -3))

EDIT 2- Решение было найдено ниже. Ошибка округления была виновата.

1 Ответ

0 голосов
/ 09 мая 2020

return ( (1.0/num) * Pow( num, power + 1 ) ); содержит ненужное округление, потому что 1.0/num дает результат 1 / num, округленный до ближайшего представимого значения, а затем это умножается на Pow(num, power+1).

Измените это на return Pow(num, power+1) / num;. Это устраняет лишнее округление. В двух показанных вами случаях это приводит к значениям, идентичным ожидаемым тестом.

(Несмотря на это улучшение, арифметические значения с плавающей запятой c подвержены ошибкам округления, которые могут привести к дополнительным различиям между тем, что вычисляется и то, что ожидает тест, в зависимости от дизайна теста.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...