Na criação de funções trigonométricas my_sind(d)
, my_cosd(d)
, my_tand(d)
, que usou um argumento grau em vez de um radiano e forneceu respostas exatas em múltiplos de 90, eu notei que o resultado foi, por vezes, -0.0
em vez 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()
e tan()
geralmente retornam o mesmo resultado de zero de sinal para uma determinada entrada de zero de sinal. Faz sentido que my_sin()
corresponda sin()
a essas entradas.
my_sind( 0.0) alike sin( 0.0) --> 0.0
my_sind(-0.0) alike sin(-0.0) --> -0.0
A questão é : por que número inteiro non_zero_n
deve / pode o resultado nunca voltar -0.0
para my_sind(180*non_zero_n)
, my_cosd(180*n + 180)
, my_tand(180*non_zero_n)
?
É fácil codificar, portanto, apenas f(-0.0)
produz -0.0
e termina com ele. Simplesmente me pergunto se existe algum motivo para fazer outro f(x)
retorno -0.0
para outro ( diferente de zero ) x
e a importância de garantir esse sinal.
Nota: Esta não é uma questão de por que 0.0
vs. -0.0
ocorre. Não é por isso cos(machine_pi/4)
que não retorna 0.0
. Nem isso é uma questão de como controlar a geração de 0.0
ou -0.0
. Eu vejo isso melhor como uma questão de design.
sind(180), sind(-180), sind(360), sind(-360),...
?my_trig(x)
sempre voltar-0.0
quando|x|
não é0.0
?+0.0
, mas procurando ver se há razões convincentes para retornar-0.0
em algumas situações (além dex == +/-0.0
).180.0
, realmente é preciso examinar os valores de precisão relativa da máquina, dados esses valores. Ou seja, o menor incremento / decremento que fornece um valor representável diferente nesse formato numérico. Em seguida, compare esse valor com o valor verdadeiro para ver se ele cairia no lado positivo ou negativo.sind(double degrees)
ecosd(double degrees)
valor pode ser devolvido:-1.0, +0.0, +1.0
. Esta postagem é sobre deve-0.0
sempre ser retornada (além de sind (-0.0)). Nota:sind()
se não usar o simplistasin(x/360*M_PI)
abordagem.Formalmente, as funções trigonométricas devem retornar o sinal de zero de acordo com o padrão C ... que deixa o comportamento indefinido.
Em face do comportamento indefinido, o princípio de menor espanto sugere duplicar o comportamento da função correspondente de
math.h
. Isso cheira justificável, enquanto diverge do comportamento da função correspondente emmath.h
cheiros como uma maneira de introduzir bugs exatamente no código que depende do sinal de zero.fonte
math.h
não retornam 0.0 quando dados argumentos como +/- pi / 2 ou +/- pi, pois essas funções só podem ter valores representáveis próximos a +/- pi / 2, etc. Esses valores "próximos" retornam resultados próximos de 0,0. Como as funções trig da biblioteca std (sin cos tan
) não retornam 0,0 (ou -0,0) para nenhuma entrada (exceto +/- 0,0), mas my_sind (), my_cosd (), my_tand () podem retornar 0,0 (ou -0,0). nenhum comportamento de 0,0 para duplicar.sin(-0.0)
deve retornar-0
é suspeita. Ele trata um detalhe de implementação do padrão IEEE como um princípio trigonométrico. Embora exista um princípio matemático geral de zero como o limite de dois intervalos incorporados na implementação do IEEE, ele ocorre nesse nível de abstração que não está na trigonometria geral [daí a variabilidade no retorno de suas funções trigonométricas]. O melhor que pode acontecer é que você pode definir uma convenção arbitrária, mas será divergente damath.h
indiferença do indivíduo sobre o sinal de zero.sin(-0.0)
deve retornar-0.0
, mas quemy_sind(x)
deve correspondersin(x)
quandox
é+/-0.0
. IOW: siga a prática anterior. Além disso, a pergunta em si é mais sobre o que fazer quandox != 0.0
,my_sind(x)
sempre deve retornar-0.0
como emmy_sind(180)
, etc? Talvez sua resposta / comentário trate disso - mas eu não vi isso.+0
versus-0
quando ele escreveumath.h
vinte anos atrás. Não está claro para mim qual é o problema que você está preocupando com a diferença.sin(rad)
por qualquer valorrad>0
e precisão nunca produzirá,0.0
pois pi é irracional. [Ref] (www.csee.umbc.edu/~phatak/645/supl/Ng-ArgReduction.pdf) No entanto,my_sind(deg)
produz um exato0.0
(ou + ou -) todo múltiplo de180.0
como o valor 0,0 é o resultado matemático correto. "Princípio de menor espanto" sugere retornar 0,0 nesses casos. Minha pergunta deve-0.0
ser retornada nesses casos?