Dans la création de fonctions trigonométriques my_sind(d)
, my_cosd(d)
, my_tand(d)
, qui a utilisé un argument de degré plutôt qu'un radian et a fourni des réponses précises à des multiples de 90, j'ai remarqué que le résultat était parfois-0.0
plutôt que 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()
et tan()
retournent généralement le même résultat de signe zéro pour une entrée de signe zéro donnée. Il est logique quemy_sin()
corresponde sin()
à ces entrées.
my_sind( 0.0) alike sin( 0.0) --> 0.0
my_sind(-0.0) alike sin(-0.0) --> -0.0
La question est : pour quel nombre entiernon_zero_n
doit / peut le résultat jamais revenir -0.0
pour my_sind(180*non_zero_n)
, my_cosd(180*n + 180)
, my_tand(180*non_zero_n)
?
Il est assez facile de coder donc ne f(-0.0)
produit -0.0
et n'en a plus besoin. Je me demande simplement s'il y a une raison de faire un autre f(x)
retour -0.0
pour un autre ( non nul ) x
et l'importance d'assurer ce signe.
Remarque: Il ne s'agit pas de savoir pourquoi 0.0
vs -0.0
se produit. Ce n'est pas pourquoi cos(machine_pi/4)
ne revient pas 0.0
. Il ne s'agit pas non plus de savoir comment contrôler la génération de 0.0
ou -0.0
. Je le vois mieux comme une question de conception.
sind(180), sind(-180), sind(360), sind(-360),...
?my_trig(x)
jamais revenir-0.0
quand|x|
est pas0.0
?+0.0
, mais je cherche à voir s'il y a des raisons impérieuses de revenir-0.0
dans certaines situations (autres quex == +/-0.0
).180.0
, il faut vraiment examiner les valeurs de précision relative de la machine étant donné ces valeurs. C'est-à-dire, le plus petit incrément / décrément qui donne une valeur représentable différente dans ce format numérique. Ensuite, comparez cette valeur avec la vraie valeur pour voir si elle tomberait du côté positif ou négatif.sind(double degrees)
et lacosd(double degrees)
valeur peuvent être retournés:-1.0, +0.0, +1.0
. Ce message est sur le point d'-0.0
être renvoyé (à l'exception de sind (-0.0)). Remarque:sind()
n'utilise pas l'sin(x/360*M_PI)
approche simpliste .Formellement, les fonctions trig devraient retourner le signe de zéro en accord avec la norme C ... ce qui laisse le comportement indéfini.
Face à un comportement indéfini, le principe du moindre étonnement suggère de dupliquer le comportement de la fonction correspondante de
math.h
. Cela sent justifiable, tout en s'écartant du comportement de la fonction correspondante enmath.h
odeurs comme un moyen d'introduire des bogues dans le code exactement qui dépend du signe de zéro.la source
math.h
ne renvoient pas 0.0 lorsque des arguments donnés comme +/- pi / 2 ou +/- pi car ces fonctions ne peuvent prendre que des valeurs représentables près de +/- pi / 2, etc. Ces valeurs "proches" renvoient des résultats proches de 0,0. Étant donné que les fonctions trig de la bibliothèque std (sin cos tan
) ne renvoient pas 0,0 (ou -0,0) pour aucune entrée (sauf +/- 0,0), mais my_sind (), my_cosd (), my_tand () peuvent renvoyer 0,0 (ou -0,0), il y a aucun comportement 0.0 à dupliquer.sin(-0.0)
devrait revenir-0
est suspecte. Il traite un détail d'implémentation de la norme IEEE comme un principe trigonométrique. Bien qu'il existe un principe mathématique général de zéro comme limite de deux intervalles incorporés dans l'implémentation IEEE, il se produit à ce niveau d'abstraction hors de la trigonométrie générale [d'où la variabilité de ce que vos fonctions trigonométriques renvoient]. Le mieux qui puisse arriver est que vous puissiez définir une convention arbitraire, mais elle sera différente demath.h
la nonchalance de 'sur le signe de zéro.sin(-0.0)
devrait revenir-0.0
, maismy_sind(x)
doit correspondre àsin(x)
quandx
est+/-0.0
. IOW: suivez la pratique précédente. De plus, la question elle-même est plutôt de savoir quoi faire quandx != 0.0
, devraitmy_sind(x)
jamais revenir-0.0
comme dansmy_sind(180)
, etc. Peut-être que votre réponse / commentaire répond à cela - mais je ne l'ai pas vu.+0
contre-0
quand il a écritmath.h
il y a vingt ans. Pour moi, le problème que vous vous inquiétez de la différence résout n'est pas clair.sin(rad)
pour n'importe quelle valeurrad>0
et de n'importe quelle précision ne cédera jamais0.0
car pi est irrationnel. [Ref] (www.csee.umbc.edu/~phatak/645/supl/Ng-ArgReduction.pdf) Cependant,my_sind(deg)
donne un exact0.0
(soit + ou -) chaque multiple de180.0
car la valeur 0.0 est le résultat mathématique correct. "Principe du moindre étonnement" suggère de renvoyer 0,0 dans ces cas. Ma question est devrait-0.0
jamais être retournée dans ces cas?