C中浮动乘法的意外输出

时间:2011-05-13 05:24:20

标签: c floating-point

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

谢谢!

4 个答案:

答案 0 :(得分:0)

尝试long double,比float更精确: http://en.wikipedia.org/wiki/Long_double

请注意,您应该更改printf(%Lf为长双倍)

答案 1 :(得分:0)

我很惊讶它没有崩溃。事实上,我甚至惊讶它甚至编译。如果它在没有警告的情况下编译,我会感到很惊讶。

  • 没有为fpreal和fpimag分配内存。
  • fpreal中的值在初始化之前使用。
  • 使用二维数组访问但不提供任何维度。
  • 将指针fpreal和fpimag打印为浮点数。
  • 尝试打印出操作前的值,但fpimag中的值已被覆盖。

(前两个可能被未显示的代码覆盖 - 其他三个看起来是明确的问题)

答案 2 :(得分: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);

答案 3 :(得分: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;

感谢大家的帮助!