在“Scanf”语句中读取双精度值

时间:2015-04-09 17:36:27

标签: c floating-point double

我编写了一个程序,用于在用户决定作为输入的范围内查找五次多项式的根。 例如:

请输入多项式的系数: -64 0 0 0 0 2

请输入范围:

4 -5.7

无效范围!请输入范围:

2 3.5

多项式有一个根:x = 2。

我的问题是当我输入例如范围** 10.4 10.2“程序无法在两个值之间进行比较并确定它是无效范围。对于整数它可以工作。

我该如何解决这个问题?

#include <stdio.h>
#define ZERO 0.00001

int main()
{
    double a_0,a_1,a_2,a_3,a_4,a_5,end_of_range,beginning_of_range;
    int x,root;

    printf("Please enter the coefficients of the polynomial:\n");

    scanf("%lf%lf%lf%lf%lf%lf", &a_0, &a_1, &a_2, &a_3, &a_4, &a_5);

    printf("Please enter the range:\n");
    scanf("%lf%lf", &beginning_of_range, &end_of_range);
    while (beginning_of_range >= end_of_range)
    {
        printf("Invalid range! Please enter the range:\n");
        scanf("%lf%lf", &beginning_of_range, &end_of_range);
    }    
    x = beginning_of_range;    
    while (x <= end_of_range)
    {    
        if ((a_0 + a_1*x + a_2*x*x + a_3*x*x*x + a_4*x*x*x*x + a_5*x*x*x*x*x >= -ZERO) 
         && (a_0 + a_1*x + a_2*x*x + a_3*x*x*x + a_4*x*x*x*x + a_5*x*x*x*x*x <= ZERO))
        {
            root = x;
            printf("The polynomial has the root x=%d.", root);
            break;
        }

        x++;

        if( x > end_of_range)
        {
            printf("Could not find a root.");
            break;
        }
    }
    return 0;
}

注意:我希望根只是整数!这就是为什么我将x声明为int

发生了一些奇怪的事情,当我进入[10.4,10.3]范围时,它只等待大约1分钟然后打印“找不到根”,尽管它必须打印无效范围。

2 个答案:

答案 0 :(得分:0)

要改变的事情:

  1. 更改x的类型。而不是

    int x;
    
  2. 使用

        double x;
    
    1. root声明为变量。

      double root;
      
    2. 修复用于打印root的格式。而不是

      printf("The polynomial has the root x=%d.", root);
      
    3. 使用

          printf("The polynomial has the root x=%lf.\n", root);
      

答案 1 :(得分:0)

x设为double,但只允许它采用整数值。

// x = beginning_of_range;
x = ceil(beginning_of_range);

// while (x <= end_of_range)
while (x <= floor(end_of_range))

  // x++
  x += 1.0;

|x|较大(大约1/DBL_EPSILON)时,此方法会出现问题,因为x += 1.0;可能不会导致x增加。


顺便说一句:

double y = ((((a_5*x + a_4)*x + a_3)*x + a_2)*x + a_1)*x + a_0; 
// is numerically more stable (and likely faster) than 
y = (a_0 + a_1*x + a_2*x*x + a_3*x*x*x + a_4*x*x*x*x + a_5*x*x*x*x*x;

轻微:建议在范围测试中删除=。一系列[11]对我来说看起来合法。

// while (beginning_of_range >= end_of_range)
while (beginning_of_range > end_of_range)