2017-02-09 6 views
0

Я пишу квадратный регрессивный решатель уравнения для класса. Я либо получаю, что% f ожидает тип аргумента double, но аргументы 2 и 3 имеют тип float на строках 45 и 51, или я получаю -nan и-inf в качестве ответа, когда я его компилирую. Я не могу найти другого способа заставить его работать. Я не могу использовать удвоение. Только поплавки и ints с подпрограммами.Аргумент ожидает двойной, но мне нужны поплавки?

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

void solve_linear(int, int); 
void solve_quad(int, int, int); 
void solve_real(int,int, int); 
void solve_complex(int, int, int); 

int main (int argc, char *argv[]){ 
    int a, b, c; 

    if (argc==4) { 
     sscanf(argv[1], "%d", &a); 
     sscanf(argv[2], "%d", &b); 
     sscanf(argv[3], "%d", &c); 
     if (a=0){ 
      if (b=0){ 
       printf("Error. A and B cannot both be 0\n"); 
      } 
      else solve_linear(b, c); 
     } 
     else solve_quad(a,b,c); 
    } 
    else printf("Error. Must enter 3 numbers on command line.\n"); 
} 

void solve_linear(b, c){ 
    float root; 
    root=(float)-c/b; 
    printf("%f\n", root); 
} 

void solve_quad(a, b, c){ 
    if(b*b-4*a*c<0){ 
     solve_complex(a,b,c); 
    } 
    else{ 
     solve_real(a, b, c); 
    } 
} 
void solve_real(a, b, c){ 
     float x1, x2; 
     x1=(-b+sqrt(b*b-4*a*c))/(2*a); 
     x2=(-b-sqrt(b*b-4*a*c))/(2*a); 
     printf("%f, %f\n", &x1, &x2); 
} 
void solve_complex(a, b, c){ 
    float x_real, x_img; 
    x_real=-b/(2.0*a); 
    x_img=(sqrt(abs(b*b-4*a*c)))/(2*a); 
    printf("%f + %fi\n", &x_real, &x_img); 
} 
+0

'if (a = 0) {' so 'a' всегда равен нулю и делит на a, это бесконечность – Lionishy

+0

'if (a = 0)' всегда будет возвращать true, то, что вы должны делать, это ' if (a == 0) '. Аналогично 'if (b == 0)' – Rishi

+0

Спасибо, что заметили это. Однако у меня все еще возникают проблемы с поплавками. – JadC

ответ

0

Как только вы вызываете printf, все аргументы float автоматически преобразуются в double. Вы не можете этого предотвратить.

Включите предупреждения своего компилятора, они скажут вам, что printf ожидает прямых значений вместо указателей, поэтому код должен быть printf("%f +%f = %f\n", a, b, a + b);.

В этом разница: scanf нуждается в указателях (так как он записывает в переменные), pintf нужны только сами значения (поэтому нет необходимости в указателях).

Смежные вопросы