这个while循环(C ++)有什么问题?

时间:2016-03-07 20:55:47

标签: c++

我很确定我是以正确的方式做到这一点,但显然我并非如此。这个while循环一旦达到0就会无限运行。它会一直输出"每月付款:$ 0.00"和#34;您支付的贷款是:0.00美元"一遍又一遍地。我做错了什么?

while (loan_balance ! = 0)
  {
    monthly_payment = loan_balance / 20;
    loan_balance = loan_balance - monthly_payment;

    cout << "Monthly Payment: $" << monthly_payment << ends;
    cout << "Your loan balance after that payment is: $" << loan_balance << endl;
  }

5 个答案:

答案 0 :(得分:4)

如果load_balance是浮点类型(floatdouble),那么load_balance != 0(其中00.0f)可能会除非明确设置为load_balance = 0.0f,否则永远不会为假。因此,应将其与较小的阈值进行比较,例如

while(load_balance >= 1e-4)

同样不等的运算符是!=,空格! =不起作用。

答案 1 :(得分:0)

loan_balance可能是浮动或双倍;它可能会减少到接近但不是很接近0.将您的比较改为&#34;&gt; 0&#34;

答案 2 :(得分:0)

0 int

类型的数据类型

0.0f doublefloat

类型的数据类型

所以你要说

while(loan_balance != 0)
  do stuff

作为回报的编译器说:&#34; loan_balance永远不会 永远 0 如果它是双/漂浮,所以我只是继续做东西。&#34;

请记住:整数不是浮动/双打

答案 3 :(得分:0)

您的loan_balance很可能永远不会真正为0。我很确定你想把你的loan_balance浮动或加倍。

double loan_balance=23000.00;
while (loan_balance >0.000)
  {
    monthly_payment = loan_balance / 20.0;
    loan_balance = loan_balance - monthly_payment;

    cout << "Monthly Payment: $" << monthly_payment << ends;
    cout << "Your loan balance after that payment is: $" << loan_balance << endl;
  }

答案 4 :(得分:0)

你面临着精确和舍入的问题。

当指数减少数字时,它将收敛为零。如果它是一个有限精度的浮点数,那么将有一个很小的数字,无法通过任何可能的表示与零区分开来。所以,像

这样的循环
double d=1.0;  // or some other finite value
while(d!=0.0)
    d*=ratio;  // ratio is some finite value so that fabs(ratio)<1.0

将以有限的迭代次数完成。

但是,取决于dratio的值,尤其是当d在次正常范围内接近零时(意味着较少的有效位)并且fabs(ratio)接近1.0(慢收敛),选定的舍入模式可以使d*ratiod舍入。当发生这种情况时,上面的循环永远不会结束。

在支持IEC 60559的机器/编译器中,您应该能够使用fegetround()fesetround()(在<fenv.h>中声明)测试和设置浮点舍入模式。您系统上的默认舍入可能是最近的。为了使上面的循环更快地收敛(或根本不收敛),最好使舍入为0。

但请注意,它有一个价格:根据应用的不同,改变圆角模式可能是不可取的,因为精度/准确度(OTOH,如果你已经在低于正常范围工作,你的精度可能不是那么好无论如何)。

但原始问题的收敛问题仍然有点复杂,因为它是通过两步操作完成的。因此在除法运算中有一个舍入,在减法运算中有另一个舍入。为了增加收敛的机会和速度,减法应尽可能多地取loan_balance的值,因此在这种情况下,可能四舍五入会更好。事实上,当我将fesetround(FP_UPWARD)添加到OP的原始代码(同时定义loan_balance1.0的初始值)时,它会在14466次迭代后收敛。 (请注意,这只是猜测,对原始代码的影响可能只是一个特殊情况。需要进行更深入的分析才能对其进行鉴定,这样的分析会必须考虑不同的比率值,以及minuend和subtrahend的相对优势。)