Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中为相同的数学运算获取错误的值?_C_Math - Fatal编程技术网

在c中为相同的数学运算获取错误的值?

在c中为相同的数学运算获取错误的值?,c,math,C,Math,我试图计算小于或等于正整数第I个根的最大整数。这是我的密码: #include <stdio.h> #include <math.h> #include <stdlib.h> int main() { int t; scanf("%d",&t); while(t>0) { long long n,q,a,b,res=0,den,x,y,z; int w; scanf

我试图计算小于或等于正整数第I个根的最大整数。这是我的密码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    int t;
    scanf("%d",&t);
    while(t>0)
    {
        long long n,q,a,b,res=0,den,x,y,z;
        int w;
        scanf("%lld",&n);

        long *arr = (long*) malloc(n*sizeof(long));
        scanf("%lld",&q);
        long *qrr = (long*) malloc(q*sizeof(long));
        for(x=0;x<n;x++)
        {
            scanf("%ld",&arr[x]);
        }
        for(y=0;y<q;y++)
        {
            scanf("%ld",&qrr[y]);
        }
        for(z=0;z<q;z++)
        {
            res = 0;
            for(w=1;w<=n;w++)
            {
                printf("%ld\n",qrr[z]);
                printf("%lld\n",(long long)(pow(qrr[z],1.0/(3))));
                res += ((long long)(pow(qrr[z],1.0/(w)))*arr[w-1]);
            }
            printf("%lld\n",res%1000000007);
        }
    }
    return 0;
}
输入
130
回答正确,但输入
8
回答错误。
我的输出是

8
1
8
1
8
1
48
30
3
30
3
30
3
163

您需要为变量分配内存

long *qrr;

qrr = (long*) malloc(q*sizeof(long));
编辑(附加猜测)

尝试两种方法:

pow(qrr[z],0.33)
pow(qrr[z],1/3)


我猜这里发生了一些事情,你的
1/3
被解释为
0
这是最近在另一个问题中观察到的(不是最近在代码块的幂函数中)。就精度而言,mingw的libm是次优的。在转换为(长-长)整数之前使用
round
,以解释
exp(y*ln(x))
作为
pow(x,y)
的实现的有限精度


由于这只解决了一半的问题,因为期望的结果是
floor(pow(x,1.0/k))
,并且如果x是精确的幂n^k,则会出现问题,由于精度问题,结果应该是n,而不是n-1。。。修改输入,以便计算

floor(pow(x+0.5, 1.0/k))
然后,63.5仍然明显小于64,因此
floor(pow(63.5,1.0/3))=3
,但64.5现在明显大于64,因此
pow(64.5,1.0/3)
也将明显大于4(远远超出5的范围)



当然,转换为整数会隐式应用floor,因此无需在代码中使用此函数。

应首先将哪个变量(long-long)(pow(8,1.0/(3))放入variable@user3714283您的长数组qrr直到答案不匹配。您的
qrr[z]
中的
z
是什么?
printf(“%ld\n”,qrr[z])
在执行powers并让我们知道它是多少之前,请使用
new
不是C,使用
malloc
浮点运算是不精确的。您的计算可能存在舍入错误。
pow
适用于浮点数,立方根的结果将不精确。(虽然
1.0/3
已经不精确了。)但这并不能解释为什么当
qrr[z]==8
时两个输出会不同。我在这两个方面都得到
2
。检查
qrr[z]
是否确实是
8
;我觉得不是。我已经检查了qrr[z]很多次了。我会再试一次。
(long long int)round(pow(x,y))
floor(pow(x+0.5, 1.0/k))