Niedawno napotkałem problem, który można łatwo rozwiązać za pomocą dzielenia modułu, ale dane wejściowe były zmiennoprzecinkowe:
Biorąc pod uwagę funkcję okresową (np.
sin) I funkcję komputera, która może ją obliczyć tylko w zakresie okresu (np. [-Π, π]), utwórz funkcję, która może obsłużyć dowolne dane wejściowe.
„Oczywistym” rozwiązaniem jest coś takiego:
#include <cmath>
float sin(float x){
return limited_sin((x + M_PI) % (2 *M_PI) - M_PI);
}
Dlaczego to nie działa? Otrzymuję ten błąd:
error: invalid operands of types double and double to binary operator %
Co ciekawe, działa w Pythonie:
def sin(x):
return limited_sin((x + math.pi) % (2 * math.pi) - math.pi)
sin(x)dla dużych wartościxfaktycznie wymaga bardzo trudnego transcendentalnego procesu redukcji argumentów, którego nie da się obejść z żadnym skończonym przybliżeniem liczby pi.