c - 争论需要双倍,但我需要 float ?

标签 c int double nan

我正在为类编写一个二次方程根求解器。我要么在第 45 行和第 51 行得到 %f 期望参数类型为 double 但参数 2 和 3 的类型为 float,或者在编译时得到 -nan 和 -inf 作为答案。我想不出任何其他方法让它发挥作用。我不能在此使用 double 。子程序仅包含 float 和整数。

#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);
}

最佳答案

一旦调用 printf,所有浮点参数都会自动转换为 double 。您无法阻止这种情况。

启用编译器的警告,它们会告诉您 printf 需要直接值而不是指针,因此代码应该是 printf("%f +%f = %f\n", a, b, a + b);.

这就是区别:scanf 需要指针(因为它写入变量),pintf 只需要值本身(因此不需要指针)。

关于c - 争论需要双倍,但我需要 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42126783/

相关文章:

arrays - C语言如何在不指定数组大小的情况下将数字读入数组

c - 在 Linux 上测试内核 Crypto API

c - 如何查看命名管道中排队的数据量?

c - 可变结构语义

java - 如何在 Java 中保留 n 位小数

C:字符串例如 "abcde123"到 int 123

c++ - 如何摆脱整数溢出警告?

c - signed 和 unsigned int 之间的转换是否在内存中保持变量的精确位模式?

PostgreSQL - 从 double 字段中获取所有整数数字以用于 to_char 函数

java - 双倍型比较器