線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1786
推到 Plurk!
推到 Facebook!

自定義"sinc"函數有問題

答題得分者是:pwipwi
howdz
一般會員


發表:17
回覆:12
積分:5
註冊:2003-12-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-14 20:44:51 IP:61.229.xxx.xxx 未訂閱
數學中有個sinc函數, 定義是: 當x=0的話,sinc(x) = 1 ; x為其他值,sinc(x) = sin(x) / x ; 我程式內容是:    //---------------------------------------------------- #include < vcl.h > #include < math.h > #pragma hdrstop    #include "Unit1.h" #define sinc(x) (x==0)?1:sin(x)/x //定義sinc函數    #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1;    __fastcall TForm1::TForm1(TComponent* Owner)         : TForm(Owner) { }    void __fastcall TForm1::Button1Click(TObject *Sender) { ListBox1->Clear(); ListBox2->Clear();          ListBox1->Items->Add(sinc(-3)); ListBox1->Items->Add(sinc(-2)); ListBox1->Items->Add(sinc(-1)); ListBox1->Items->Add(sinc(0)); ListBox1->Items->Add(sinc(1)); ListBox1->Items->Add(sinc(2)); ListBox1->Items->Add(sinc(3));     for(int i=0; i<7; i++) ListBox2->Items->Add(sinc(-3+i)); } //---------------------------------------------------- 1.照道理說兩個ListBox的值應該都一樣,sinc函數對稱x=0, 但ListBox2出現的值卻不一樣... 2.最後面sinc(-3+i)若改成sinc(i-3), 執行時就會有"Floating point division by zero"的錯誤發生, 請問是哪裡出錯了?我該怎麼改呢?為什麼? 謝謝! p.s.我打不出"+"的半形,< > 包著的文字也會不見,所以文字看起來有些地方怪怪的,請多見諒 發表人 - howdz 於 2004/11/14 20:54:07 發表人 - howdz 於 2004/11/14 21:00:15
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-14 21:36:39 IP:211.76.xxx.xxx 未訂閱
howdz你好:     你應該是中了巨集的陷井了,會divide by zero因是為你後來的碼會變成以下的樣子:     
// sinc(i-3) 處理過後,會變成...    (i-3==0) ? 1: sin(i-3)/i-3    // 你想要的應該是:    (i-3==0) ? 1: sin(i-3)/(i-3)     
C 中有更好用的東西:function template, 這可以做到相同的效率,又可免去這類的錯誤。 建議你可以把sinc的巨集改成如下的function:
template 
inline T sinc(T x)
{
   return (x==T(0))? 1 : sin(x) / x;
}
 
發表人 - pwipwi 於 2004/11/14 21:37:57
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-14 21:50:55 IP:219.81.xxx.xxx 未訂閱
Hello howdz,    底下那行請改為:
ListBox2->Items->Add(sinc((-3 i)));
ListBox2->Items->Add(sinc((i-3)));
howdz
一般會員


發表:17
回覆:12
積分:5
註冊:2003-12-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-14 22:17:50 IP:61.229.xxx.xxx 未訂閱
原來如此!我現在才知道原來巨集在處理時是跟自己想像的不一樣, 謝謝版主詳盡的解說與建議,雖然還不是很懂版主建議的function, 不過我會慢慢研究的,謝謝。 也謝謝nlj859兄的建議, 我用了類似您的方法,就是在定義sinc函數的地方改為 #define sinc(x) (x==0)?1:sin(x)/(x) 把最後的x 學 nlj859 兄加上括弧, 總算解決了,值都對,也不會有Floating point division by zero的問題了 謝謝二位
系統時間:2024-05-18 23:08:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!