[問題] std::acos(-1.0) vs. MARCO of Pi

看板C_and_CPP (C/C++)作者 (部長)時間13年前 (2013/01/08 00:54), 編輯推噓3(309)
留言12則, 6人參與, 最新討論串1/1
小弟正在用bcb打關於影像處理的程式 目前正卡在FFT複數的地方 上網google了一下,找到下面的程式 想問pi為何要這樣宣告?? 因為小弟以往一般的程式一直都是定義成 #define pi 3.14159265 const double pi = std::acos(-1.0); const std::complex<double> i(0,1); std::complex<double> wn = std::exp((2*pi*i)/double(n)); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.235.95.7

01/08 01:00, , 1F
巨集的 pi 是會被 inline 的,有些時候會造成除錯不便
01/08 01:00, 1F

01/08 01:13, , 2F
感謝~ 已解決
01/08 01:13, 2F

01/08 01:24, , 3F
我經常都會用const代替define
01/08 01:24, 3F

01/08 01:24, , 4F
這個C++03 可以嗎= =?
01/08 01:24, 4F

01/08 02:29, , 5F
我想說一下,一樓說的是一個原因,但不是真正原因.主因是,
01/08 02:29, 5F

01/08 02:29, , 6F
只是用 const, #define 的 PI 在存二進位時都可能有誤差,
01/08 02:29, 6F

01/08 02:30, , 7F
因精度可能是 53 / 15.22 位,那個 .22 就是誤差來源,所以
01/08 02:30, 7F

01/08 02:30, , 8F
另一派作法就是用 acos(-1.), 誤差最小.
01/08 02:30, 8F

01/12 14:40, , 9F
我有看過 2.*acos(0.) 的做法 不知這個誤差跟上一個比如何?
01/12 14:40, 9F

01/16 22:53, , 10F
目前還是公認 acos(-1.) 誤差最小,有用到2.0*的會差在最後
01/16 22:53, 10F

01/16 22:53, , 11F
一個 bit 以上 (這是可能) !!
01/16 22:53, 11F

01/16 22:55, , 12F
( 和浮點數的 四捨六入五成雙 扯上關係了.. )
01/16 22:55, 12F
文章代碼(AID): #1Gwlsh_i (C_and_CPP)
文章代碼(AID): #1Gwlsh_i (C_and_CPP)