Como señaló Hans Lundmark el problema se debe a la conversión del argumento a un C double
antes de realizar el cálculo.
Pero si no quieres recurrir a una biblioteca matemática de alta precisión, hay una forma (al menos en Python) de calcular un valor más exacto utilizando las identidades de suma de ángulos.
from math import cos, sin
def cossin(x):
'''
Return (cos(x), sin(x)) more accurately.
'''
if abs(x) < 2 ** 53:
# All integers below this threshold are represented exactly,
# so just use the normal math module functions.
return (cos(x), sin(x))
else:
a = float(x)
b = x - int(a) # the approximation error
# a is a float, so use the normal math functions.
cos_a = cos(a)
sin_a = sin(a)
# for b, call recursively in case *it* can't be represented as float
cos_b, sin_b = cossin(b)
return (cos_a * cos_b - sin_a * sin_b, cos_a * sin_b + sin_a * cos_b)
Esto coincide bastante con el resultado de WolframAlpha.
>>> cossin(452175521116192774)
(-0.5229034783961185, -0.8523919006426797)
Un enfoque alternativo es utilizar una aproximación de alta precisión de para reducir el argumento módulo 2. (En Python, puede utilizar la clase Fraction para almacenar su aproximación. Esto te da:
$$452175521116192774 \approx 71965969330795778 \times 2\pi + 4.162135302888925$$
Y tomar el coseno del argumento reducido te dará el resultado correcto.
>>> cos(4.162135302888925)
-0.5229034783961188