簡體   English   中英

浮點乘法的C輸出意外

[英]Unexpected output in C from float multiply

我在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

謝謝!

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

請注意,您應該更改您的printf(長整數為%Lf)

我很驚訝它沒有崩潰。 實際上我很驚訝它甚至可以編譯。 如果它編譯時沒有警告,我將很震驚。

  • 沒有為fpreal和fpimag分配內存。
  • fpreal中的值在初始化之前使用。
  • 使用二維數組訪問,但不提供任何維。
  • 以浮點形式輸出指針fpreal和fpimag。
  • 嘗試打印出與操作前相同的值,但fpimag中的值已被覆蓋。

(前兩個可能被未顯示的代碼覆蓋-其他三個看起來是確定的問題)

請看以下兩行:

(*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);

嘿,我發現問題很明顯:

我正在覆蓋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;

謝謝大家的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM