自定義"sinc"函數有問題 |
答題得分者是:pwipwi
|
howdz
一般會員 發表:17 回覆:12 積分:5 註冊:2003-12-16 發送簡訊給我 |
數學中有個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 發送簡訊給我 |
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發表人 - pwipwi 於 2004/11/14 21:37:57 |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
|
howdz
一般會員 發表:17 回覆:12 積分:5 註冊:2003-12-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |