c++11 - 是什么导致第一个功能看起来与第二个功能相似的错误?
问题描述
下面的函数给出了不同的结果。它们之间的假定差异是什么导致不同的输出。例如 n=30 和 k=417219134 分别给出输出 0 和 1。
功能1(错误):
int kthGrammar(int n, int k) {
if (n==1){
return 0;
}
int parent_node = kthGrammar(n-1, ceil(float(k)/2));
int isKodd = k%2;
if (isKodd){
return parent_node;}
else{
return parent_node==0?1:0;}
}
功能2(右):
int kthGrammar(int n, int k){
if (n==1){
return 0;
}
int isKodd = k%2;
if (isKodd){
return kthGrammar(n-1, (k+1)/2);}
else{
return (kthGrammar(n-1, k/2)==0?1:0);}
}
解决方案
int
417219134
不能用 完美表示float
。
float f = 417219134;
double d = 417219134;
std::cout << std::fixed
<< f << '\n' // 417219136.000000
<< d << '\n'; // 417219134.000000
这解释了为什么ceil(float(k)/2)
返回一个与预期 when 相差 +1 的数字k = 417219134
。
我会double
在函数中转换为:
int parent_node = kthGrammar(n-1, ceil(k / 2.));
推荐阅读
- python - 查找整数 i 是否可以被列表中的所有元素整除
- php - WooCommerce 贝宝结帐网关
- javascript - 使用新 URL 对象创建新请求
- reactjs - 为什么 this.state 在这种情况下不可用?
- python - 分隔线的最小和最大长度
- bash - Windows 上 Git 路径的位置
- javascript - React Native Animated - 卡片不会翻转
- java - 默认电话应用程序意图操作拨号未打开活动
- gradle - Kotlin 项目的 SonarQube 报告中的 0% 覆盖率
- java - java.lang.ClassNotFoundException: org.apache.logging.log4j.Logger 更新 log4j 1.2.17 到 2.13.0 后