【问题标题】:Reading double values in "Scanf" statement在“Scanf”语句中读取双精度值
【发布时间】:2015-06-15 05:15:31
【问题描述】:

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

请输入多项式的系数: -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 分钟,然后打印“找不到根”,尽管它必须打印无效范围。

【问题讨论】:

  • 我想你只需要把x 也变成double 吗?
  • @DigitalNinja 我将 x 声明为 int 因为 In 只需要 Integer 根。
  • 好的,但是当您进行 x = beginning_of_range; 分配时,您的起始范围是一个浮点值。就像 R Sahu 所说,当 root 不是整数时会发生什么?要将其四舍五入为整数?
  • 这个赋值只是为了处理整数根。其他情况被忽略。我知道它不是完美的程序,但显然他们想从中教我们一些东西,处理浮点数。
  • 发生了一些奇怪的事情,当我进入范围 [10.4, 10.3] 时,它只等待大约 1 分钟,然后打印“找不到根目录”,尽管它必须打印无效范围。

标签: c floating-point double


【解决方案1】:

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;

次要:建议在范围测试中删除=。 [1 1] 的范围在我看来是合法的。

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

【讨论】:

    【解决方案2】:

    要改变的地方:

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

      int x;
      

    使用

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

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

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

    使用

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

    【讨论】:

    • 我添加了一条注释,我希望根为整数,这些更改是否适用于该原因?
    • @F1sargyan 您可以轻松地将浮点数截断为整数,但您想如何处理根不是整数的情况?
    • 我会忽略它们,这正是任务所需要的。
    • @F1sargyan,在这种情况下,您应该使用std::round 来获取最接近的整数。如果它与根之间的差异大于容差,则忽略根。否则,接受根目录。
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多