请考虑以下代码:
#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.这里出了什么问题?
答案 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架构而有所不同 - 我很乐意看到您打印出来的内容。