【问题标题】:Replacing constant with variable of the same value and type, causes different results用相同值和类型的变量替换常量会导致不同的结果
【发布时间】:2020-04-24 11:01:51
【问题描述】:
int main()
{
    int nodes = 7;

    int var_1 = (int)(log((double)(nodes + 1))/log(2) - 1);
    int var_2 = (int)(log((double)(7 + 1))/log(2) - 1);

    printf("%d\n", var_1);
    printf("%d\n", var_2);

    return 0;
}

上述代码将变量var_1var_2 相应地初始化为值1 和2。

为什么它们有不同的值,因为变量 nodes 的值为 7,与下一个等式中的常数相同。

编辑:我不会尝试“修复”代码,否则我可以将 nodes+1 分配给变量。

【问题讨论】:

  • 当我运行它时,我得到相同的结果 - 2。

标签: c type-conversion


【解决方案1】:

第一条语句可能是在运行时由标准库中预编译的代码(使用 libm)计算出来的,第二条语句可能是在编译时由编译器计算出来的(使用 MPFR)。

libmlog(8) 可能比 MPFR 的要少一点点。

2.079441541...7 / 0.69314... = 2.999999...
2.079441541...8 / 0.69314... = 3.000000...

【讨论】:

  • 所以如果我理解正确,问题与我使用的编译器有关吗?如果我使用不同的编译器运行代码,我可能会得到正确的结果?
  • 在将 double 转换为 int 时不要只去掉小数:进行一些舍入,例如使用(可能不对,我不是数字科学家):(int)(doubleval + 0.5)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多