W tworzeniu funkcji parametrów wyzwalania my_sind(d)
, my_cosd(d)
, my_tand(d)
, że użył argumentu stopni zamiast radianie jedną i pod warunkiem dokładnych odpowiedzi na wielokrotność 90, zauważyłem, że wynik był czasami -0.0
zamiast 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()
i tan()
zazwyczaj zwraca ten sam wynik zero znaku dla danych wejściowych zero znaku. Ma to sens, że my_sin()
powinno pasować sin()
do tych danych wejściowych.
my_sind( 0.0) alike sin( 0.0) --> 0.0
my_sind(-0.0) alike sin(-0.0) --> -0.0
Pytanie brzmi : co cały numer non_zero_n
powinien / może wynikiem kiedykolwiek powrócić -0.0
do my_sind(180*non_zero_n)
, my_cosd(180*n + 180)
, my_tand(180*non_zero_n)
?
Kodowanie jest wystarczająco łatwe, więc f(-0.0)
produkuje się -0.0
i wykonuje się je. Po prostu zastanawiasz się, czy jest jakiś powód, aby dokonać innego f(x)
zwrotu -0.0
za jakikolwiek inny ( niezerowy ) x
i znaczenie ubezpieczenia tego znaku.
Uwaga: To nie jest pytanie, dlaczego występuje 0.0
vs. -0.0
Nie dlatego cos(machine_pi/4)
nie wraca 0.0
. Nie jest to również pytanie, jak kontrolować generowanie 0.0
lub -0.0
. Uważam to najlepiej za pytanie projektowe.
sind(180), sind(-180), sind(360), sind(-360),...
?my_trig(x)
kiedykolwiek wrócić-0.0
, gdy|x|
nie jest0.0
?+0.0
, ale szukam przekonania, czy istnieją ważne powody do powrotu-0.0
w niektórych sytuacjach (innych niżx == +/-0.0
).180.0
naprawdę trzeba sprawdzić wartości względnej precyzji maszyny, biorąc pod uwagę te wartości. Oznacza to, że najmniejszy przyrost / spadek, który daje inną reprezentatywną wartość w tym formacie liczbowym. Następnie porównaj tę wartość z wartością prawdziwą, aby zobaczyć, czy spadnie ona na stronę dodatnią czy ujemną.sind(double degrees)
icosd(double degrees)
wartość mogą być zwrócone:-1.0, +0.0, +1.0
. Ten post powinien-0.0
zostać kiedykolwiek zwrócony (oprócz sind (-0.0)). Uwaga:sind()
nie nie skorzystać z uproszczonegosin(x/360*M_PI)
podejścia.Formalnie, funkcje trig powinny zwracać znak zero zgodnie ze standardem C ... co pozostawia zachowanie niezdefiniowane.
W obliczu nieokreślonego zachowania zasada najmniejszego zdziwienia sugeruje powielenie zachowania odpowiedniej funkcji z
math.h
. Pachnie to uzasadnieniem, jednocześnie odbiegając od zachowania odpowiedniej funkcji wmath.h
zapachach, jak sposób wprowadzenia błędów do dokładnie kodu, który zależy od znaku zera.źródło
math.h
nie zwracają 0,0, gdy podane są argumenty takie jak +/- pi / 2 lub +/- pi, ponieważ te funkcje mogą przyjmować reprezentowalne wartości w pobliżu +/- pi / 2 itp. Te „bliskie” wartości zwracają wyniki blisko 0,0. Ponieważ funkcjesin cos tan
wyzwalające biblioteki std ( ) nie zwracają 0,0 (lub -0,0) dla żadnego wejścia (z wyjątkiem +/- 0,0), ale my_sind (), my_cosd (), my_tand () mogą zwracać 0,0 (lub -0,0) brak zachowania 0.0 do powielenia.sin(-0.0)
powinno zwrócić,-0
jest podejrzane. Traktuje szczegół implementacji standardu IEEE jako zasadę trygonometryczną. Chociaż istnieje ogólna zasada matematyczna zerowa jako granica dwóch przedziałów zawarta w implementacji IEEE, występuje ona na tym poziomie abstrakcji poza ogólną trygonometrią [stąd zmienność powrotu funkcji trygonometrycznych]. Najlepsze, co może się zdarzyć, to zdefiniowanie arbitralnej konwencji, ale różni się ona odmath.h
nonszalancji ponad znakiem zera.sin(-0.0)
wrócić-0.0
, alemy_sind(x)
powinien pasować,sin(x)
kiedyx
jest+/-0.0
. IOW: postępuj zgodnie z poprzednią praktyką. Co więcej, samo pytanie dotyczy bardziej tego, co zrobić, kiedyx != 0.0
powinienmy_sind(x)
powrócić-0.0
jak wmy_sind(180)
itp.? Być może twoja odpowiedź / komentarz dotyczy tego - ale tego nie widziałem.+0
kontra-0
kiedy pisałmath.h
dwadzieścia lat temu. Nie jest dla mnie jasne, jaki problem rozwiązuje twój niepokój związany z różnicą.sin(rad)
dowolnej wartościrad>0
i dowolnej precyzji nigdy nie da się,0.0
ponieważ pi jest irracjonalne. [Ref] (www.csee.umbc.edu/~phatak/645/supl/Ng-ArgReduction.pdf) Jednakmy_sind(deg)
daje dokładną0.0
(albo + lub -) każdą wielokrotność,180.0
ponieważ wartość 0,0 jest poprawnym wynikiem matematycznym. „Zasada najmniejszego zdziwienia” sugeruje zwrócenie 0,0 w tych przypadkach.-0.0
W takich przypadkach moje pytanie powinno zostać zwrócone?