Bei der Erstellung trigonometrischen Funktionen my_sind(d)
, my_cosd(d)
, my_tand(d)
, dass ein gewisses Maß Argument , anstatt eine Radiant ein verwendet und genaue Antworten auf ein Vielfaches von 90 vorgesehen ist , bemerkte ich , dass das Ergebnis war manchmal -0.0
nicht 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()
und geben tan()
typischerweise das gleiche Vorzeichen-Null-Ergebnis für eine gegebene Vorzeichen-Null-Eingabe zurück. Es ist sinnvoll, dass für diese Eingaben my_sin()
übereinstimmen sollte sin()
.
my_sind( 0.0) alike sin( 0.0) --> 0.0
my_sind(-0.0) alike sin(-0.0) --> -0.0
Die Frage ist : für das, was ganze Zahl non_zero_n
sollte / kann das Ergebnis je zurückkehren -0.0
für my_sind(180*non_zero_n)
, my_cosd(180*n + 180)
, my_tand(180*non_zero_n)
?
Es ist einfach genug zu codieren, also nur f(-0.0)
produziert -0.0
und damit fertig. Einfach fragen, ob es einen Grund gibt, eine andere f(x)
Rendite -0.0
für eine andere ( ungleich Null ) x
zu erzielen, und wie wichtig es ist, dieses Zeichen zu versichern.
Hinweis: Dies ist keine Frage, warum 0.0
vs. -0.0
auftritt. Dies ist nicht der Grund, warum cos(machine_pi/4)
nicht zurückkehrt 0.0
. Dies ist auch keine Frage, wie die Erzeugung von 0.0
oder gesteuert werden kann -0.0
. Ich sehe es am besten als Designfrage.
sind(180), sind(-180), sind(360), sind(-360),...
?my_trig(x)
jemals zurückkehren,-0.0
wenn|x|
nicht0.0
?+0.0
, aber zu prüfen, ob es zwingende Gründe gibt,-0.0
in bestimmten Situationen (außerx == +/-0.0
) zurückzukehren.180.0
muss man wirklich die Werte der relativen Maschinengenauigkeit untersuchen, wenn diese Werte gegeben sind. Das heißt, das kleinste Inkrement / Dekrement, das in diesem numerischen Format einen anderen darstellbaren Wert ergibt. Vergleichen Sie diesen Wert dann mit dem wahren Wert, um festzustellen, ob er auf die Plus- oder Minus-Seite fällt.sind(double degrees)
undcosd(double degrees)
Wert können zurückgegeben werden :-1.0, +0.0, +1.0
. Dieser Beitrag sollte ungefähr-0.0
zurückgegeben werden (abgesehen von sind (-0.0)). Hinweis:sind()
nicht nicht den vereinfach verwendetsin(x/360*M_PI)
Ansatz.Formal sollten Triggerfunktionen das Vorzeichen Null gemäß dem C-Standard zurückgeben ... wodurch das Verhalten undefiniert bleibt.
Angesichts undefinierten Verhaltens schlägt das Prinzip des geringsten Erstaunens vor, das Verhalten der entsprechenden Funktion aus zu duplizieren
math.h
. Dies riecht gerechtfertigt, während es vom Verhalten der entsprechenden Funktion abweicht, wenn esmath.h
darum geht, Fehler in genau den Code einzuführen, der vom Vorzeichen Null abhängt.quelle
math.h
geben nicht 0.0 zurück, wenn Argumente wie +/- pi / 2 oder +/- pi angegeben werden, da diese Funktionen nur darstellbare Werte in der Nähe von +/- pi / 2 usw. Annehmen können. Diese "nahen" Werte geben Ergebnisse nahe 0,0 zurück. Da diesin cos tan
Triggerfunktionen der Standardbibliothek () für keine Eingabe 0.0 (oder -0.0) zurückgeben (außer +/- 0.0), können my_sind (), my_cosd (), my_tand () 0.0 (oder -0.0) zurückgeben Kein 0.0-Verhalten zum Duplizieren.sin(-0.0)
die zurückkehren sollte,-0
ist verdächtig. Es behandelt ein Implementierungsdetail des IEEE-Standards als trigonometrisches Prinzip. Obwohl es ein allgemeines mathematisches Prinzip von Null als Grenze für zwei in der IEEE-Implementierung enthaltene Intervalle gibt, tritt es auf dieser Abstraktionsebene nicht innerhalb der allgemeinen Trigonometrie auf [daher die Variabilität dessen, was Ihre trigonometrischen Funktionen zurückgeben]. Das Beste, was passieren kann, ist, dass Sie eine beliebige Konvention definieren können, die jedoch vonmath.h
der Nonchalance über das Vorzeichen Null abweicht.sin(-0.0)
vor, zurückzukehren-0.0
, aber dasmy_sind(x)
sollte übereinstimmen,sin(x)
wenn esx
ist+/-0.0
. IOW: Befolgen Sie die vorherigen Übungen. Weiter ist die Frage selbst mehr darüber, was zu tun ist, wannx != 0.0
, solltemy_sind(x)
jemals-0.0
wie inmy_sind(180)
usw. zurückkehren? Vielleicht spricht Ihre Antwort / Ihr Kommentar das an - aber das habe ich nicht gesehen.+0
gegen ,-0
als er schriebmath.h
vor zwanzig Jahren. Mir ist nicht klar, welches Problem Ihr Ärger über den Unterschied löst.sin(rad)
für jeden Wertrad>0
und von jeder Präzision niemals nachgeben wird,0.0
da pi irrational ist. [Ref] (www.csee.umbc.edu/~phatak/645/supl/Ng-ArgReduction.pdf)my_sind(deg)
Ergibt jedoch ein genaues0.0
(entweder + oder -) jedes Vielfache von,180.0
da der Wert 0.0 das richtige mathematische Ergebnis ist. "Prinzip des geringsten Erstaunens" schlägt vor, in diesen Fällen 0,0 zurückzugeben. Meine Frage ist, sollte-0.0
in diesen Fällen jemals zurückgegeben werden?