浮动双?计算错误,使用double

时间:2011-01-07 19:54:03

标签: c floating-point precision

非常有趣的事情。找到方程结果的最简单的源代码:ax + b = 0.我很奇怪,当双x = -13/12 = -1.000000时;和 double x = -12 / 13 = 0.000000; (对于a和b int(类型转换)或double),但浮动或双x = -13f / 12f = 1.083333(这是正确的)。 双重有什么不对?

并且方程式{double或float x = - ((double或float)b)/ a;}可以是{int a,b;} ??如果它不对 - 为什么?

int main()
{
 double a, b, x; 
 scanf("%f %f",&a, &b);
 fflush(stdin);
 if(a!=0)
 {x = -b/a; printf("x = %f", x);}
 else printf("There is no solve in your equation.");
 getchar();
 return 0;
}

谢谢

2 个答案:

答案 0 :(得分:4)

在C中,如果你写

double x = 13/12;

编译器不会将除法视为浮点除法。相反,它将使用整数进行除法,截断结果,并将其存储在double中。更一般地说,在确定要执行的算术类型时,C不会查看它所写入的变量的类型。它只是查看操作数的类型。

要解决此问题,请写

double x = 13.0 / 12.0;

这些文字的类型为double,因此除法可以正常工作。

答案 1 :(得分:1)

您的scanf类型错误:
它们应为%lf NOT %f

#include <stdio.h>

int main()
{
    double a, b, x;
    scanf("%lf %lf",&a, &b);
    fflush(stdin);
    if(a!=0)
    {
        x = -b/a;
        printf("x = %lf", x);
    }
    else
        printf("There is no solve in your equation.");
    return 0;
}

> g++ t.cpp
> ./a.out
12
13
x = -1.083333
> ./a.out
13
12
x = -0.923077

PS。学会写好的代码 以上是可怕的,没有人想读这样的伪劣代码。