Нещодавно я зіткнувся з проблемою , яку легко можна було вирішити за допомогою поділу за модулем, але вхідним сигналом було плаваюче:
Враховуючи періодичну функцію (наприклад
sin) та комп’ютерну функцію, яка може обчислювати її лише в межах діапазону періодів (наприклад, [-π, π]), створіть функцію, яка може обробляти будь-який вхід.
"Очевидне" рішення є приблизно таким:
#include <cmath>
float sin(float x){
return limited_sin((x + M_PI) % (2 *M_PI) - M_PI);
}
Чому це не працює? Я отримую цю помилку:
error: invalid operands of types double and double to binary operator %
Цікаво, що це працює в Python:
def sin(x):
return limited_sin((x + math.pi) % (2 * math.pi) - math.pi)
sin(x)великих значеньxнасправді вимагає дуже складного процесу трансцендентального скорочення аргументів, який не може пройти при будь-якому кінцевому наближенні pi.