c - C中相同划分的不同结果

标签 c division

我正在用 ANSI-C 编写程序。

给定这些值:

static long long int QList[12] = { 0, 2, 6, 30, 210, 2310, 30030, 510510, 9699690, 223092870, 6469693230, 200560490130 };
static long long int phiList[12] = { 0, 1, 2, 8, 48, 480, 5760, 92160, 1658880, 36495360, 1021870080, 30656102400 };
static int hList[12] = { 0, 1, 2, 4, 12, 60, 60, 120, 360, 3960, 27720, 27720 };

我在这样的循环中使用它们:

double alfa;
static double Log2 = log(2.);

for(k=3; k<8; k++){
    alfa = QList[k]/phiList[k]/ hList[k]/ Log2;
    [.........]
}

如果这样写,对于每个“k”,alfa = 0.0000000000000000000。

相反,如果我写:

double alfa;
static double Log2 = log(2.);

for(k=3; k<8; k++){
    alfa = QList[k];
    alfa= alfa/ phiList[k];
    alfa = alfa / hList[k];
    alfa = alfa / Log2;
    [.........]
}

Alfa 采用正确的值(不同于零)。 问题似乎是“hList[k]”的除法。

为什么?

最佳答案

除法是从左到右执行的,因此您的第一个案例对前两个除法使用整数除法,舍弃任何余数。

您可以通过转换为 double 强制它一直使用 double :

alfa = ((double)QList[k])/phiList[k]/ hList[k]/ Log2;

关于c - C中相同划分的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19950109/

相关文章:

c - 文件范围变量和 C 中的函数参数的名称可能相同。可以区分吗?

algorithm - 以大 O 表示法 N 翻倍时的运行时间比率

html - 在另一个 div 上启用 Readonly DIV 的滚动

java - 除以 2 个数字不返回正确

线分割排列的算法

assembly - split 有多快?

c - 为什么 fseeko() 会失败并显示 EINVAL?

c - Evas 和 X11 示例

c++ - 如何使用 CreateProcess 或 ShellExecute 执行管道命令

C 腐败或双重释放,为什么?