我正在研究一个个人项目,其中一部分涉及计算一定范围内的广场和立方体(本例中为10,000)。所以,我写了一个简单的C程序,我认为它会验证我的结果。这里是小程序,我放在一起,看到所有的立方体:为什么我在这个简单的C程序中得到这个奇怪的输出?
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int main() {
double i;
int cubes = 0;
for (i = 1; i < 10000; i++) {
if (i == cbrt(i) * cbrt(i) * cbrt(i)) {
printf("%f --- %f\n",i, cbrt(i));
cubes++;
}
}
printf("%i\n", cubes);
return 0;
}
我得到了(不正确)输出:24.如果你想看看这个去看了看问题的数字15和20上输出。为什么我得到错误的答案(正确的答案是21)是完全不同的问题。我的问题出现了,当我瞎搞我的代码,试图解决这个问题,我暂时把它改成这样:
int main() {
double i;
int cubes = 0;
for (i = 1; i < 10000; i++) {
double temp = (cbrt(i) * cbrt(i) * cbrt(i));
if (i == temp) {
printf("%f -> %f\n", i, temp);
cubes++;
}
}
printf("%i\n", cubes);
return 0;
}
现在,程序打印1至9999之间的每个号码所以,我失去的东西可笑容易或发生了什么?我所做的只是在cbrt(i)*cbrt(i)*cbrt(i)
而不是有条件我设置一个双变量等于结果并将其放置在条件。为什么我的程序会这样做?
我不知道为什么这个投票。我觉得这是一个合理的问题。对不起S.O.社区...
你究竟在做什么?您是否在尝试使用整数立方体根来查找数字? –
第一印象 - 您正在检查浮点数(“双”)的平等,这只是在寻找问题。为什么不用简单的'int'来代替?或'uint64_t',或其他。 – Kamiccolo
假设我是一个int并且temp是一个double,由于double的内部四舍五入,你不会经常达到平等。 – Duck