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.0
en 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_n
debe / puede devolver el resultado nunca -0.0
para 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.0
y termina con él. Simplemente preguntándome si hay alguna razón para hacer otro f(x)
retorno -0.0
por otro ( distinto de cero ) x
y la importancia de asegurar ese signo.
Nota: Esta no es una cuestión de por qué ocurre 0.0
vs. -0.0
Esto no es por qué cos(machine_pi/4)
no regresa 0.0
. Tampoco se trata de cómo controlar la generación de 0.0
o -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.0
cuando|x|
no0.0
.+0.0
, pero estoy buscando para ver si hay razones de peso para regresar-0.0
en 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.0
alguna 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.h
olores como una forma de introducir errores en el código exactamente que depende del signo de cero.fuente
math.h
no 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-0
es 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.h
equilibrio sobre el signo de cero.sin(-0.0)
que regrese-0.0
, pero esomy_sind(x)
debería coincidirsin(x)
cuandox
sea+/-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.0
como enmy_sind(180)
, etc.? Tal vez su respuesta / comentario aborde eso, pero no lo he visto.+0
frente a-0
cuando escribió hacemath.h
veinte años. No me queda claro qué problema está resolviendo su inquietud por la diferencia.sin(rad)
para cualquier valorrad>0
y de cualquier precisión nunca cederá0.0
ya 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.0
como 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.0
alguna vez debería devolverse en estos casos?