iT邦幫忙

0

C語言三角函數請教

  • 分享至 

  • xImage

最近使用math.h中的sin和cos時遇到了一個問題,我已經知道三角函數裡面的參數是用弧度而不是角度,但我想辦法把參數改成角度的形式後,會有精度誤差的問題,想請問有辦法解決嗎?
像是cos(270度)執行後會是-0(就是下面這段程式碼)

cos(M_PI/180 * 270) = -0.000000
看更多先前的討論...收起先前的討論...
re.Zero iT邦研究生 5 級 ‧ 2022-12-22 21:52:54 檢舉
參考: https://stackoverflow.com/questions/74642053/weird-result-when-cos-is-0
這算是浮點精度的陷阱還是 M_PI 定義的陷阱?
讓我們討論無理數的藝術好了~ XD
P.s. 精度、誤差在各種用到數學的領域,是很重要而且常被忽視的陷阱。跑演算時要時常意識到喔。
了解,我是有想到精確度的問題,打錯問題的重點了,抱歉
比較想知道怎麼排除這種問題
re.Zero iT邦研究生 5 級 ‧ 2022-12-23 01:18:16 檢舉
我不懂你想排除的是啥,這就是一定會發生的問題,能排除就不會存到現在了~
(不然幹嘛有人挑戰演算圓周率小數點後位數;而且其結果也難以完整用在一般實作上)
頂多就是採用高精度或降低誤差間距的演算以降低誤差值。
(常見於專業數學軟體上,你就能看到一些函數或演算法的誤差、效能等資訊說明;C 提供的是一般作業系統能有效實作的演算與精度。)
若是關於浮點數在電腦程式上的「相等」判斷上,
常見的就是用「將浮點數宣告採用最高同一精度」(這還要看編譯器實作狀況等各項因素),
或「if(abs(a-b)<1e-9)then{isEqual=true}」之類的方式處理。
目前能想到的就這樣了,如無法滿足你,可能你得多找其他資訊或等別人回答了,畢竟我對這方面沒深入研究。
(話說,你在這裡回我,系統沒跳通知~我還是回來看有沒啥新見解才注意到有回應,哪時我忘了還請見諒~)
re.Zero iT邦研究生 5 級 ‧ 2022-12-23 12:49:05 檢舉
補:你試試:
printf("cos(M_PI /180 *270):[%e];\n", cos(M_PI /180 *270));
應該能理解為何用 %f (或 %lf ?)時會顯示負零了。
(話說,我應該第一時間就提這個才對,傻了我~)
了解~謝謝你
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答