2017-02-09 7 views
0

私はクラスのための二次方程式の根のソルバーを書いています。 %fは引数型doubleを期待していますが、引数2と3は45行目と51行目にfloat型を持っています。あるいは、コンパイル時に-nanと-inを答えとして取得します。私はそれを働かせる他の方法を理解できません。私はこれにダブルスを使用することはできません。サブプログラムには浮動小数点数と整数のみが入ります。引数は倍精度ですが浮動小数点が必要ですか?

#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

'(A = 0)は'常にtrueを返すために起こっている場合は、{ 'ので、 '' 常にゼロであるとに分け、それは無限 – Lionishy

+0

だ'、あなたがやるべきことは ' です(= 0)の場合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は値そのものを必要とするだけです(ポインタは必要ありません)。

関連する問題