2011-05-13 98 views
1

我正在C中執行乘法和加法運算,並且得到錯誤的結果。C中的意外輸出浮點乘法

我執行以下操作:

#include <stdio.h> 
#include <strlib.h> 
#include <math.h> 

int main() 
{ 
    float** fpimag; 
    float** fpreal; 

    // Some code to assign fpimag and fpreal 
    // fpimag and fpreal are two dimensional arrays that are 
    // passed by reference to some functions to assign data to them 
    allocatememory(&fpimag,&fpreal); 
    storedata(&fpimag,&fpreal); 


    autofunction(&fpimag,&fpreal); 
} // main() 

void autofunction(float*** fpimag,float***fpreal) { 
    float expreal; 
    float expimag; 

    expreal = cos((*afph_correct)[row][column]); 
    expimag = sin((*afph_correct)[row][column]); 

    (*fpimag)[row][column] = (*fpimag)[row][column] * expreal + (*fpreal)[row][column] * expimag; 

printf("Operation looks like this\n"); 
printf("%f*%f + %f*%f\n",(*fpimag)[row][column],expreal,(*fpreal)[row][column],expimag); 
printf("The value is %f\n",(*fpimag)[row][column]); 
} // autofunction 

這是輸出我得到:

Operation looks like this 
-0.003095*-0.431162 + 0.000027*-0.902275 
The value is 0.003865 

然而正確的答案應該是:

0.0013101 

謝謝!

+1

您需要發佈代碼的相關部分。 I.E.您正在打印的部分... – 2011-05-13 05:25:58

+0

K謝謝您的建議,我更新了我的問題以反映您的建議 – Veridian 2011-05-13 05:36:17

+0

好的。現在好點了。你現在可以發佈你分配值的地方嗎? – 2011-05-13 05:41:27

回答

0

嘿,我發現這是很明顯的問題:

我重寫fpreal的值,然後嘗試在其他計算中使用它。

因此我所做的:

(*fpreal)[row][column] = (*fpreal)[row][column]*expreal - (*fpimag)[row][column]*expimag; 
(*fpimag)[row][column] = (*fpimag)[row][column]*expreal + (*fpreal)[row][column]*expimag; 

因爲我已經更新了代碼,以便fpreal和fpimag的值存儲在一些臨時變量並使用這些計算,因爲這樣的:

oldreal = (*fpreal)[row][column]; 
oldimag = (*fpimag)[row][column]; 

(*fpreal)[row][column] = oldreal*expreal - oldimag*expimag; 
(*fpimag)[row][column] = oldimag*expreal + oldreal*expimag; 

儘管謝謝大家的幫助!

0

嘗試長雙,更精確的比浮動: http://en.wikipedia.org/wiki/Long_double

請注意,你需要改變你的printf(%Lf的長雙)

+0

hey @ amir-pincovici我該如何申報長雙? – Veridian 2011-05-13 05:50:43

+1

將「flout」替換爲「long double」。另外,我現在注意到你的原始printf是錯誤的。嘗試printf(「%f *%f +%f *%f \ n」,(* fpimag)[row] [column],expreal,(* fpreal)[row] [column],expimag); – Amir 2011-05-13 05:58:10

+0

埃米爾是正確的,因爲你正在打印你的數組的地址,但解釋爲浮點數。這不是在代碼中執行的計算。 (但精度與問題無關) – UncleO 2011-05-13 06:35:35

0

我很驚訝,它不會崩潰。事實上,我甚至感到驚訝,甚至編譯。如果編譯沒有警告,我會被gobsmacked。

  • 沒有內存分配給fpreal和fpimag。
  • fpreal中的值在被初始化之前使用。
  • 使用二維數組訪問,但不給任何維度。
  • 將指針fpreal和fpimag打印爲浮點數。
  • 嘗試打印出操作前的值,但fpimag中的值已被覆蓋。

(前兩個可以通過代碼覆蓋未顯示 - 其它三個看起來是明確的問題)

+0

爲了簡單起見,我省去了內存分配,顯然我的內存被分配並賦值,我在我的main()註釋中提到過。謝謝你的關心,但沒有一個答案是正確的 – Veridian 2011-05-13 17:10:53

0

請看下面兩行:

(*fpimag)[row][column] = (*fpimag)[row][column] * expreal + 
         (*fpreal)[row][column] * expimag; 
printf("%f*%f + %f*%f\n",fpimag,expreal,fpreal,expimag); 

你沒看見fpimag與(* fpimag)[row] [column]不一樣? (並且與fpreal相同)您正在編寫指向浮點指針值的指針,而不是指針指向的值。試試這個:

float imag = (*fpimag)[row][column]; 
float real = (*fpreal)[row][column]; 
(*fpimag)[row][column] = imag * expreal + real * expimag; 
printf("%f*%f + %f*%f\n",imag,expreal,real,expimag); 
+0

我已經解決了這個問題,我的第一個版本的帖子忽略了fpimag和fpreal實際上是二維數組的事實。當有人要求我說明我是如何賦值的時候,我忘了更新此打印聲明,但現在它已在網站上更新。所以基本上,這不是問題,我很驚訝大家一直在箱子內部思考 – Veridian 2011-05-13 17:12:58

+0

@ magnus-skog,我更新了帖子,以反映我的代碼實際上是如何。我原本簡化了我的二維數組,因爲這只是人們不需要知道的細節。我現在更新了這篇文章,但這不是問題,我在我的實際代碼中正確地做了這個 – Veridian 2011-05-13 17:28:11