→ iscu:; 06/10 04:37
→ chrisjon:真是簡單又明顯的錯誤...謝謝Orz 06/10 09:18
※ 編輯: chrisjon 來自: 123.195.137.179 (06/11 00:38)
推 VictorTom:黃色那個, 代表你的const 4xxx數字太大, 不是預設const 06/11 01:06
→ VictorTom:value (int)放的下的, 再數字後面加上UL試試, 就像這樣 06/11 01:06
→ VictorTom:123456UL <-這樣; UL還是LU啊?? 其實32bit的環境應該只 06/11 01:07
→ VictorTom:加U也行.... 06/11 01:08
→ VictorTom:等等, 我錯了, 你寫那個數超過0xFFFFFFFFU了, 也就是這 06/11 01:09
→ VictorTom:個整數根本超過32bit能表達的最大範圍, 可能要依環境找 06/11 01:09
→ VictorTom:64bit int的解決方案.... (int64?? long long??) 06/11 01:10
這我之前有問過,有兩種宣告方式
long long和int64_t
不過聽說int64_t要新版的才有支援?
推 VictorTom:google一下好像是用 12345LL 這樣.... 06/11 01:12
推 VictorTom:第二個error就單純para變數不存在, 既然不是local var, 06/11 01:14
→ VictorTom:看這個用法八成是global var, 找一下這個變數在哪定義的 06/11 01:15
→ VictorTom:要是不存在, 那你就得搞清楚para到底是哪來的東西.... 06/11 01:15
→ VictorTom:要是存在, 可能要多宣告個extern該變數吧....?? 06/11 01:16
怪了...通常計算後的最大值是2^31-1
而mdx_pro產出來的值是X/p,p為2^31-1,而X範圍在0~p-1
(也就是X/p是介於0<=x<1之間的小數,也就是"不可能出現1")
照理用unsigned int 應該可用數是0~2^32-1...也就是上面說的4294967296-1
(2^32)*x,不可能會出現2^32(因為x一定是小於1的小數)
我把mdx_pro的程式碼貼回來好了...
(因為指標太多,看起來很花,問完就刪掉了^^"把括號加上顏色應該比較好看範圍)
以下接在上程式碼中,紅色"中刪"的位置
#define DMOD(n,p)((n)%(p))
static double mdx_pro(void *vpar,void *vind)
{
md_para *para = vpar;
md_index *index = vind;
if(++index->mdi==para->k){index->mdi=0;} //計算第i-1項指標
index->mdj=(index->mdi+1)%para->k; //計算計算第i-k-1項指標
index->mda=(index->mdi+2)%para->k; //計算計算第i-k項指標
if(index->mdi==0) //計算第i-2項指標
{index->mdb=para->k-1;}
else{index->mdb=index->mdi-1;}
para->seed[index->mdj] = DMOD(DMOD(para->seed[index->mdi] +
para->m1*(para->seed[index->mdi] + para->p - para->seed[index->mdj]),para->p)+
DMOD(para->d*(para->seed[index->mda]+para->p-para->seed[index->mdb]),para->p)
,para->p);
return ((double)para->seed[index->mdj]+0.5)*para->minv;
}
麻煩各位先進再幫忙看了,感謝
※ 編輯: chrisjon 來自: 123.195.137.179 (06/11 12:11)
推 VictorTom:您可能誤算了, 0~2^31-1, 所以最大只能到4294967295.... 06/11 13:28
→ VictorTom:個位數字是5, 6的話已經是 0x100000000了....:) 06/11 13:28
→ VictorTom:可表達 4294967296 個整數, 但最大的數是 4294967295 :) 06/11 13:35
不好意思....趕著上課,沒寫清楚..
2^32 = 42949672956
※ 編輯: chrisjon 來自: 120.125.72.28 (06/11 16:07)
推 VictorTom:Hm~小弟我的意思是, 下面這個warning.... 06/11 17:55
→ VictorTom:warning: integer constant is too large for "long" 06/11 17:55
→ VictorTom:應該就是因為您用了 4294967296 這個值當CONST, 而這個 06/11 17:56
→ VictorTom:值超過了32 bit表達數的上限了, 所以才發了warning給您. 06/11 17:56
→ VictorTom:至於那個綠色的 para 找不到的問題, 您可能search整個 06/11 17:57
→ VictorTom:project所有code找找看吧, error就是沒定義過它啊. 06/11 17:58
推 VictorTom:那個 4294967296 跟誰產生的沒有關係, 而是您code裡自己 06/11 18:00
→ VictorTom:就寫的一個定值在那裡, compiler警告你它太大了而已. 06/11 18:00
→ chrisjon:warning 那個解決了,重新看一下說明書再比較 06/11 18:11
→ chrisjon:發現只畏把4294967296加一個.0就解決了 06/11 18:11
→ chrisjon:另外para那個,有人跟我說是seed 只是區域變數 06/11 18:12
推 VictorTom:加一個.0是直接轉成double用喔.... 06/11 18:12
→ chrisjon:所以不用delete 06/11 18:12
→ chrisjon:所以我把那行當註解 //掉 compile過了,但...不會跑..囧" 06/11 18:12
→ chrisjon:可是我參考的文是這樣寫的啊...compile也沒問題...~.~" 06/11 18:14
推 VictorTom:好吧, 我沒仔細看code研究演算法, 只能單純就語法上與 06/11 18:22
→ VictorTom:compiler丟的訊息瞎給意見, 再來的就沒辦法了....Orz 06/11 18:23
→ chrisjon:嗯嗯!!感恩!! 謝謝^^ 06/11 18:26