При создании Триг функций my_sind(d)
, my_cosd(d)
, my_tand(d)
, что использовали градусный аргумент , а не радиан один и давал точные ответы на кратные 90, я заметил , что результат был иногда -0.0
вместо 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()
и tan()
обычно возвращают один и тот же знак нулевого результата для данного знака нулевого ввода. Имеет смысл, что my_sin()
должно соответствовать sin()
этим входам.
my_sind( 0.0) alike sin( 0.0) --> 0.0
my_sind(-0.0) alike sin(-0.0) --> -0.0
Вопрос заключается в том : для того, что целое число non_zero_n
должно / может результат когда - либо возвращаться -0.0
к my_sind(180*non_zero_n)
, my_cosd(180*n + 180)
, my_tand(180*non_zero_n)
?
Это достаточно просто для кодирования, так что только f(-0.0)
производит -0.0
и делает с ним. Просто интересно, есть ли какая-либо причина, чтобы сделать другое f(x)
возвращение -0.0
для любого другого ( отличного от нуля ) x
и важности страхования этого знака.
Примечание: Это не вопрос о том, почему 0.0
против -0.0
происходит. Это не то, почему cos(machine_pi/4)
не возвращается 0.0
. Это также не вопрос о том, как контролировать поколение 0.0
или -0.0
. Я вижу это лучше всего как вопрос дизайна.
sind(180), sind(-180), sind(360), sind(-360),...
?my_trig(x)
когда-нибудь вернуться,-0.0
когда|x|
нет0.0
?+0.0
, но я смотрю, есть ли веские причины для возвращения-0.0
в некоторых ситуациях (кромеx == +/-0.0
).180.0
действительно нужно изучить значения относительной точности машины, учитывая эти значения. То есть наименьшее увеличение / уменьшение, которое дает другое представимое значение в этом числовом формате. Затем сравните это значение с истинным значением, чтобы увидеть, упадет ли оно на плюс или минус.sind(double degrees)
иcosd(double degrees)
значение может быть возвращено:-1.0, +0.0, +1.0
. Этот пост должен-0.0
быть возвращен (кроме sind (-0.0)). Примечание:sind()
это не использовать упрощенныйsin(x/360*M_PI)
подход.Формально тригогенные функции должны возвращать знак нуля в соответствии со стандартом C ... что оставляет поведение неопределенным.
Перед лицом неопределенного поведения принцип наименьшего удивления предполагает дублирование поведения соответствующей функции из
math.h
. Это пахнет оправданно, в то время как отклонение от поведения соответствующей функции вmath.h
запахах похоже на способ введения ошибок именно в код, который зависит от знака нуля.источник
math.h
не возвращают 0.0, если даны такие аргументы, как +/- pi / 2 или +/- pi, поскольку эти функции могут принимать представимые значения только вблизи +/- pi / 2 и т. Д. Эти «близкие» значения возвращают результаты около 0,0. Поскольку функции триггера библиотеки std (sin cos tan
) не возвращают 0.0 (или -0.0) для любого ввода (кроме +/- 0.0), но my_sind (), my_cosd (), my_tand () могут возвращать 0.0 (или -0.0), то есть нет поведения 0.0 для дублирования.sin(-0.0)
должна вернуться,-0
является подозрительной. Он рассматривает детали реализации стандарта IEEE как тригонометрический принцип. Хотя существует общий математический принцип нуля как предела двух интервалов, воплощенный в реализации IEEE, он происходит на том уровне абстракции, не входящем в общую тригонометрию [отсюда и изменчивость того, что возвращают ваши тригонометрические функции]. Лучшее, что может произойти, это то, что вы можете определить произвольное соглашение, но оно будет отличаться отmath.h
небрежности по знаку нуля.sin(-0.0)
возвращаться-0.0
, но этоmy_sind(x)
должно совпадать,sin(x)
когдаx
есть+/-0.0
. IOW: следуйте предыдущей практике. Кроме того, сам вопрос заключается в том, что делать, когдаx != 0.0
,my_sind(x)
когда-либо должен вернуться,-0.0
какmy_sind(180)
и т.д.? Может быть, ваш ответ / комментарий говорит об этом - но я этого не видел.+0
сравнении ,-0
когда он писалmath.h
двадцать лет назад. Мне не ясно, какую проблему решает твое беспокойство по поводу разницы.sin(rad)
для любого значенияrad>0
и любой точности никогда не даст,0.0
как пи иррационально. [Ref] (www.csee.umbc.edu/~phatak/645/supl/Ng-ArgReduction.pdf) Однакоmy_sind(deg)
дает точное0.0
(или + или -) каждое кратное, так180.0
как значение 0.0 является правильным математическим результатом. «Принцип наименьшего удивления» предлагает вернуть 0.0 в этих случаях. Мой вопрос должен-0.0
быть возвращен в этих случаях?