【问题标题】:Write a program that determines the values for two variables to be equal to a specific value编写一个程序,确定两个变量的值等于特定值
【发布时间】:2016-05-26 07:15:05
【问题描述】:

我之前问过这个问题,当我第一次问这个问题时,我不知道问题是什么,但我知道并且我已经尝试通读浮点数学是否损坏?以及为什么浮点数不准确?他们说明了问题的原因,但我并没有真正看到在我编写的代码中绕过这个问题,所以现在我问是否有人知道我应该对代码做什么以使程序工作。下面的代码和说明

这个程序背后的想法是找到两个双精度数 at 的值,如果它们相乘,它们会给出一个指定的值。因此,如果指定值为 4,则程序必须找到 at 的值,如果将它们相乘,则为 4。变量 t 的范围为 5 到 10。

我写了以下代码

int main(void)
{
    double a = 0.01;
    double t = 5;
    while(1){
        if(t * a != 4){
            t = t + 0.01;
            if(t > 10){
                t = 5;
                a = a + 0.01;
            }
        }
        else if (t * a == 4){
            break;
        }
    }
    printf("%f %f", t, a);
    return 0;   
}

如果我尝试使用 0.01 递增值,代码似乎不起作用,尽管如果递增的值为 1,它会起作用。我知道发生这种情况的原因,但我将如何在这个程序代码中解决这个问题或者是还有其他方法可以编写代码吗?代码似乎永远循环

【问题讨论】:

  • 请注意,"The code doesn't seem to work" 永远不足以描述问题。发生了什么?你预计会发生什么?
  • 什么不起作用?你能说出你的期望和得到的吗?
  • t * a 可能永远不会完全正确 4. 如果您阅读过“浮点数学是否被破坏”文章,您应该知道这一点。
  • 您缺乏基本的调试技能。在 while 循环的开头插入 printf("%lf %lf %lf\n", t, a, t * a);,你会看到会发生什么。

标签: c increment


【解决方案1】:

不要在两个双精度之间使用相等,而是使用一个小范围。

#include <math.h>
#include <stdio.h>

int main(void)
{
    double a = 0.01;
    double t = 5.0;
    double epsilon = 0.000001;
    while(1){
        if(fabs(t * a - 4.0) < epsilon){
            break;
        }
        else{
            t = t + 0.01;
            if(t > 10){
                t = 5;
                a = a + 0.01;
            }
        }
    }
    printf("%f %f %f", t, a, a*t);
    return 0;   
}

请注意,fabs(x - y) &lt; epsilon 等同于 (y - epsilon) &lt; x &amp;&amp; x &lt; (y + epsilon),因此您正在检查 x 是否落在 y 周围的一个非常小的区间内。

【讨论】:

    【解决方案2】:

    如果 a * t 是 4,那么 a 将是 4/t。现在如果t 在5 到10 的范围内并且可以取值5.1、5.2 等,那么a 将为t 的每个值都有一个对应的值。

    即对于 t = 5.1 a = 0.78431

    对于 t = 5.2 a = 0.7692。

    您可以运行一个循环来打印每个 t 值的 a 值

    t = 5.0;
    for (i=0; i<50; i++)
    {
       t += 0.1;
       a = 4/t;
       printf ("%f %f",a,t);
    }
    

    【讨论】:

    • 虽然这个答案确实解决了这个特定问题,但这类似于给 OP 一条鱼,而不是教他们如何捕捉它。问题实际上是关于如何确定一般的 FP 相等性,而不是解决给定5 &lt;= t &amp;&amp; t &lt; 10 &amp;&amp; 0 &lt; aa * t == 4
    猜你喜欢
    • 2020-06-25
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多