Неожиданный вывод в C от умножения с плавающей точкой - PullRequest
1 голос
/ 13 мая 2011

Я выполняю операцию умножения и сложения в 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 голосов
/ 13 мая 2011

Эй, я нашел проблему, это было довольно очевидно:

Я перезаписывал значение 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 голосов
/ 13 мая 2011

Я удивлен, что не падает.На самом деле я удивлен, что даже компилируется.Я был бы ошеломлен, если бы он компилировался без предупреждений.

  • Нет памяти, выделенной для fpreal и fpimag.
  • Значения в fpreal используются перед инициализацией.
  • Используетдоступ к двумерному массиву, но не дает никаких измерений.
  • Печатает указатели fpreal и fpimag в виде чисел с плавающей запятой.
  • Пытается распечатать значения, какими они были до операции, но значение в fpimag имеетбыл перезаписан.

(Первые два могут быть покрыты кодом, который не показан - остальные три выглядят как определенные проблемы)

0 голосов
/ 13 мая 2011

Посмотрите на следующие две строки:

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

Разве вы не видите, что fpimag не совпадает с (* fpimag) [строка] [столбец]? (и то же самое с 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 голосов
/ 13 мая 2011

Попробуйте long double, точнее, чем float: http://en.wikipedia.org/wiki/Long_double

Обратите внимание, что вы должны изменить свой printf (% Lf для long double)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...