c - 在 c 中获取以 2 为底的对数时出错

标签 c math

我想求1到2048的二进制对数,不知道为什么不行,求不到正确的数。

如果我使用 float ,它可以工作,但它曾经使用整数,我已经用这种方法完成了一个程序,但现在它不能工作了。将 unsigned int 更改为 int 不起作用。有人知道为什么吗?

for(unsigned int numero=1;numero<=2048;numero*=2)
{
    int x=log10(numero)/log10(2);
    printf("%d\n",x);
}

return 0;

它打印:

0 1 2 2 4 5 5 6 8 9 10 11

应该是:

0 1 2 3 4 5 6 7 8 9 10 11

看起来它适用于某些数字,但我不明白为什么它不适用于所有数字。

最佳答案

log10 返回 float ( double )。对于您传递的大多数数字,log10 的值不能用 float 精确表示,因此您可能会得到类似于 log10(8)/log10(2) == 2.9999999 的值精确的 3。转换为 int 会将其截断为 2。要解决这个问题,您应该正确舍入:

int x = lrint(log10(numero)/log10(2));

或者,如果您的编译器没有 lrint 函数,您可以使用:

int x = log10(numero)/log10(2) + 0.5;

这适用于这种情况。

请注意,有多种方法可以计算所需的结果。由于 float 已经以 2 为底存储指数,您可以通过调用 frexp 来检索它:

int x;
frexp(numero, &x);

另一种方法是完全避免 float 学运算,并使用内部函数来获取 numero 中设置的最后一位的索引。不幸的是,没有跨平台的方式来做到这一点。

关于c - 在 c 中获取以 2 为底的对数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55790847/

相关文章:

c++ - 围绕点的最小凸多边形

python - 欧拉计划 92

字符与整数运算

c - 在 C 中获取控制台缓冲区内容

c - 不使用 malloc 重复不同的字符串模式

转换到 _Bool

c# - 如何计算 C# 中的幂?

python - 提示用户退出或继续

c - 不明白这个开关以及为什么输出是这样

c - 为什么通过引用调用的函数在从 mex 包装器中的其他源文件链接时不起作用?