En la creación de funciones trigonométricas my_sind(d), my_cosd(d), my_tand(d), que utiliza un argumento grado más que un un radián y proporcionan respuestas exactas a múltiplos de 90, me di cuenta de que el resultado era a veces -0.0en lugar de 0.0.
my_sind( 0.0) --> 0.0
my_sind(-0.0) --> -0.0
my_sind(180.0) --> -0.0
my_sind(360.0) --> 0.0
sin()y tan()normalmente devuelve el mismo resultado de signo cero para una entrada de signo cero dada. Tiene sentido que my_sin()coincida sin()con esas entradas.
my_sind( 0.0) alike sin( 0.0) --> 0.0
my_sind(-0.0) alike sin(-0.0) --> -0.0
La pregunta es : ¿para qué número entero non_zero_ndebe / puede devolver el resultado nunca -0.0para my_sind(180*non_zero_n), my_cosd(180*n + 180), my_tand(180*non_zero_n)?
Es bastante fácil de codificar, por lo que solo f(-0.0)produce -0.0y termina con él. Simplemente preguntándome si hay alguna razón para hacer otro f(x) retorno -0.0por otro ( distinto de cero ) xy la importancia de asegurar ese signo.
Nota: Esta no es una cuestión de por qué ocurre 0.0vs. -0.0Esto no es por qué cos(machine_pi/4)no regresa 0.0. Tampoco se trata de cómo controlar la generación de 0.0o -0.0. Lo veo mejor como una pregunta de diseño.

sind(180), sind(-180), sind(360), sind(-360),...?my_trig(x)alguna vez debería volver-0.0cuando|x|no0.0.+0.0, pero estoy buscando para ver si hay razones de peso para regresar-0.0en algunas situaciones (que no seanx == +/-0.0).180.0, uno realmente tiene que examinar los valores de precisión relativa de la máquina dados esos valores. Es decir, el incremento / decremento más pequeño que proporciona un valor representable diferente en ese formato numérico. Luego, compare ese valor con el valor verdadero para ver si caería en el lado positivo o negativo.sind(double degrees)ycosd(double degrees)valor pueden ser devueltos:-1.0, +0.0, +1.0. Esta publicación es acerca de si-0.0alguna vez debe ser devuelta (aparte de sind (-0.0)). Nota:sind()no no utilizar el simplesin(x/360*M_PI)enfoque.Formalmente, las funciones trigonométricas deberían devolver el signo de cero de acuerdo con el estándar C ... lo que deja el comportamiento indefinido.
Ante un comportamiento indefinido, el principio de menor asombro sugiere duplicar el comportamiento de la función correspondiente
math.h. Esto huele justificable, mientras que diverge del comportamiento de la función correspondiente enmath.holores como una forma de introducir errores en el código exactamente que depende del signo de cero.fuente
math.hno devuelven 0.0 cuando se dan argumentos como +/- pi / 2 o +/- pi ya que estas funciones solo pueden tomar valores representables cerca de +/- pi / 2, etc. Estos valores "cercanos" devuelven resultados cercanos a 0.0. Dado que las funciones trigonométricas de la biblioteca std (sin cos tan) no devuelven 0.0 (o -0.0) para ninguna entrada (excepto +/- 0.0), pero my_sind (), my_cosd (), my_tand () pueden devolver 0.0 (o -0.0) no 0.0 comportamiento para duplicar.sin(-0.0)debería regresar-0es sospechosa. Trata un detalle de implementación del estándar IEEE como un principio trigonométrico. Aunque hay un principio matemático general de cero como el límite de dos intervalos incorporado en la implementación de IEEE, ocurre en ese nivel de abstracción, no dentro de la trigonometría general [de ahí la variabilidad en lo que devuelven sus funciones trigonométricas]. Lo mejor que puede suceder es que puede definir una convención arbitraria, pero será divergente de la falta demath.hequilibrio sobre el signo de cero.sin(-0.0)que regrese-0.0, pero esomy_sind(x)debería coincidirsin(x)cuandoxsea+/-0.0. IOW: siga la práctica previa. Además, la pregunta en sí es más acerca de qué hacer cuandox != 0.0, ¿my_sind(x)alguna vez debería regresar-0.0como enmy_sind(180), etc.? Tal vez su respuesta / comentario aborde eso, pero no lo he visto.+0frente a-0cuando escribió hacemath.hveinte años. No me queda claro qué problema está resolviendo su inquietud por la diferencia.sin(rad)para cualquier valorrad>0y de cualquier precisión nunca cederá0.0ya que pi es irracional. [Ref] (www.csee.umbc.edu/~phatak/645/supl/Ng-ArgReduction.pdf) Sin embargo,my_sind(deg)produce un exacto0.0(ya sea + o -) cada múltiplo de180.0como el valor 0.0 es el resultado matemático correcto. El "principio del mínimo asombro" sugiere devolver 0.0 en estos casos. Mi pregunta es ¿-0.0alguna vez debería devolverse en estos casos?