Dalam menciptakan fungsi trigonometri my_sind(d)
, my_cosd(d)
, my_tand(d)
, yang digunakan argumen gelar daripada satu radian dan memberikan jawaban yang tepat pada kelipatan 90, saya melihat bahwa hasilnya kadang-kadang -0.0
bukan 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()
dan tan()
biasanya mengembalikan hasil tanda nol yang sama untuk input tanda nol yang diberikan. Masuk akal bahwa my_sin()
harus cocok sin()
dengan input tersebut.
my_sind( 0.0) alike sin( 0.0) --> 0.0
my_sind(-0.0) alike sin(-0.0) --> -0.0
Pertanyaannya adalah : untuk apa seluruh nomor non_zero_n
harus / mungkin hasilnya pernah kembali -0.0
untuk my_sind(180*non_zero_n)
, my_cosd(180*n + 180)
, my_tand(180*non_zero_n)
?
Kode ini cukup mudah sehingga hanya f(-0.0)
menghasilkan -0.0
dan dilakukan dengan itu. Sederhana bertanya-tanya apakah ada alasan untuk membuat pengembalian lain untuk yang lain ( tidak nol ) dan pentingnya mengasuransikan tanda itu.f(x)
-0.0
x
Catatan: Ini bukan pertanyaan mengapa 0.0
vs -0.0
terjadi. Ini bukan mengapa cos(machine_pi/4)
tidak kembali 0.0
. Ini juga bukan pertanyaan tentang bagaimana mengendalikan generasi 0.0
atau -0.0
. Saya melihatnya sebagai pertanyaan desain.
sind(180), sind(-180), sind(360), sind(-360),...
?my_trig(x)
kembali-0.0
ketika|x|
bukan0.0
?+0.0
, tetapi mencari untuk melihat apakah ada alasan kuat untuk kembali-0.0
dalam beberapa situasi (selainx == +/-0.0
).180.0
, kita benar-benar harus memeriksa nilai-nilai presisi mesin relatif mengingat nilai-nilai itu. Artinya, kenaikan / penurunan terkecil yang memberikan nilai keterwakilan yang berbeda dalam format numerik itu. Kemudian, bandingkan nilai itu dengan nilai sebenarnya untuk melihat apakah nilai itu akan jatuh pada sisi positif atau negatif.sind(double degrees)
dancosd(double degrees)
nilai dapat dikembalikan:-1.0, +0.0, +1.0
. Posting ini adalah tentang harus-0.0
pernah dikembalikan (selain dari sind (-0.0)). Catatan:sind()
tidak tidak menggunakan sederhanasin(x/360*M_PI)
pendekatan.Secara formal, fungsi trigonometri harus mengembalikan tanda nol sesuai dengan standar C ... yang membuat perilaku tidak terdefinisi.
Dalam menghadapi perilaku yang tidak terdefinisi, prinsip paling tidak heran menyarankan duplikasi perilaku dari fungsi yang sesuai
math.h
. Ini bau dibenarkan, sementara menyimpang dari perilaku fungsi yang sesuai dalammath.h
bau seperti cara untuk memperkenalkan bug ke dalam persis kode yang tergantung pada tanda nol.sumber
math.h
tidak mengembalikan 0,0 ketika diberikan argumen seperti +/- pi / 2 atau +/- pi karena fungsi-fungsi ini hanya dapat mengambil nilai yang diwakili dekat +/- pi / 2, dll. Nilai "dekat" ini mengembalikan hasil di dekat 0,0. Karena fungsi trigonometri std library (sin cos tan
) tidak mengembalikan 0,0 (atau -0,0) untuk input apa pun (kecuali +/- 0,0), tetapi my_sind (), my_cosd (), my_tand () dapat mengembalikan 0,0 (atau -0,0) ada tidak ada perilaku 0,0 untuk digandakan.sin(-0.0)
harus kembali-0
adalah tersangka. Ini memperlakukan detail implementasi standar IEEE sebagai prinsip trigonometri. Meskipun ada prinsip matematika umum nol sebagai batas dua interval yang terkandung dalam implementasi IEEE, itu terjadi pada tingkat abstraksi yang tidak dalam trigonometri umum [karenanya variabilitas dalam fungsi trigonometri Anda kembali]. Yang terbaik yang bisa terjadi adalah Anda dapat mendefinisikan konvensi yang sewenang-wenang, tetapi akan berbeda darimath.h
ketidakseimbangan atas tanda nol.sin(-0.0)
harus kembali-0.0
, tapi itumy_sind(x)
harus sesuaisin(x)
saatx
ini+/-0.0
. TKI: ikuti latihan sebelumnya. Lebih jauh pertanyaan itu sendiri adalah lebih lanjut tentang apa yang harus dilakukan kapanx != 0.0
, harusmy_sind(x)
kembali-0.0
seperti padamy_sind(180)
, dll? Mungkin jawaban / komentar Anda membahas hal itu - tetapi saya belum melihatnya.+0
versus-0
ketika dia menulismath.h
dua puluh tahun yang lalu. Tidak jelas bagi saya masalah apa yang membuat Anda khawatir tentang perbedaan yang diselesaikan.sin(rad)
untuk nilairad>0
dan presisi apa pun tidak akan pernah menghasilkan0.0
karena pi tidak rasional. [Ref] (www.csee.umbc.edu/~phatak/645/supl/Ng-ArgReduction.pdf) Namunmy_sind(deg)
menghasilkan yang tepat0.0
(salah + atau -) setiap kelipatan180.0
karena nilai 0,0 adalah hasil matematika yang benar. "Prinsip tercengang" menyarankan pengembalian 0,0 dalam kasus ini. Pertanyaan saya apakah harus-0.0
dikembalikan dalam kasus ini?