Недавно я столкнулся с проблемой, которую можно было легко решить с помощью модульного деления, но ввод был с плавающей точкой:
Учитывая периодическую функцию (например,
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
фактически требует очень сложного трансцендентного процесса редукции аргумента, который не может обойтись никаким конечным приближением числа пи.