带有float变量的C ++递归函数

时间:2015-11-21 13:08:56

标签: c++ floating-point

请考虑以下代码:

#include <iostream>
using namespace std;
int rec(float in){
   if(in < 0) return 0;
   else if(n == 0) return 1;
   else return(rec(in-.2));
}
int man(){
   int n;
   cin >> n;
   cout << rec (n);
   return 0;
}

我希望它在输入为1时打印1.但它打印0.这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

在这些行中

if(in < 0) return 0;
else if(in == 0) return 1;

您的代码正在运行整数和浮点数之间的比较。特别是'in&lt; 0'和'in == 0'。这通常无法为您提供预期结果for various reasons (see article)

现在,您可以将值0转换为浮点数,或将其更改为“0.0”,但这并不能真正解决您的问题。

真正的问题是,每次从数字中减去0.2时,它会创建一个几乎但不比之前减少0.2的数字。发生这种情况是因为在c / c ++中,浮点数使用称为IEEE Standard for Floating-Point Arithmetic / IEEE 754的标准格式以二进制形式表示/存储。根据我之前链接的文章,可能没有将中间结果存储为0.8 - > 0.6 - &gt; 0.4等。

您可以通过回显rec:

中的值来快速检查实际发生的情况
#include <limits>
// allows for use of numeric_limits<float>::digits10
// which tells us the precision of 
// the floating point number represented in decimal
// without having to know the specifics of the platform.

/*** [omitted code] ***/

int rec(float in){
   cout << setprecision(numeric_limits<float>::digits10) << in << ' ' << flush;
   /* flush will force the ostream to display to the screen
      instead of waiting for the buffer to fill up.
      useful if the recursive function never exits for some reason. */
   if(in < 0) return 0;
   else if(in == 0) return 1;
   else return(rec(in-.2));
}

你应该看到'in'的值最终永远不会等于0,所以返回1的代码位永远不会被触发。

实际值会根据您的CPU架构而有所不同 - 我很乐意看到您打印出来的内容。