与 int 相比,double 数据类型如何在 C++ 中大量改变答案?
How does double data type change the answer compared to int, by a huge amount in C++?
我正在解决一个问题“计算阶乘的位数”,并将答案存储在两种数据类型 int 和 double 中。两种数据类型的答案是不同的,存储在 double 中的那个最终是正确的。这是怎么回事?
代码如下:
int n;
cin>>n;
double ans;
int ans_int;
double digits = 0;
int digit_int = 0;
for (int i = 1; i<=n; i++) {
digits += log10(i);
digit_int += log10(i);
}
ans = floor(digits)+1;
ans_int = floor(digit_int)+1; // This gives wrong answer.
cout<<ans<<endl;
如果在上面的代码中,我将数字作为 int 而不是 double,我得到的答案是 1 位,在 5 中!而不是 3,在其他情况下类似。
问题出在这一行:digit_int += log10(i);
。当 i
小于 10 时,其对数将小于 1。将小于 1 的值加到整数上将有效地加零。
将双精度数转换为 int,首先将其向下舍入为最接近的整数。所以如果你加起来说 log10(x) for x ≤ 10 ≤ 99,对数总是在 1 和 2 之间,但是转换为 int 只会加 1,而不是正确的值。
我正在解决一个问题“计算阶乘的位数”,并将答案存储在两种数据类型 int 和 double 中。两种数据类型的答案是不同的,存储在 double 中的那个最终是正确的。这是怎么回事?
代码如下:
int n;
cin>>n;
double ans;
int ans_int;
double digits = 0;
int digit_int = 0;
for (int i = 1; i<=n; i++) {
digits += log10(i);
digit_int += log10(i);
}
ans = floor(digits)+1;
ans_int = floor(digit_int)+1; // This gives wrong answer.
cout<<ans<<endl;
如果在上面的代码中,我将数字作为 int 而不是 double,我得到的答案是 1 位,在 5 中!而不是 3,在其他情况下类似。
问题出在这一行:digit_int += log10(i);
。当 i
小于 10 时,其对数将小于 1。将小于 1 的值加到整数上将有效地加零。
将双精度数转换为 int,首先将其向下舍入为最接近的整数。所以如果你加起来说 log10(x) for x ≤ 10 ≤ 99,对数总是在 1 和 2 之间,但是转换为 int 只会加 1,而不是正确的值。