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

时间:2014-06-11 09:17:14

标签: 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("%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;
}

这是我的输入

1
3 2
4 5 6
8 30

输入130的答案是正确的,但8错误 我的输出是

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

2 个答案:

答案 0 :(得分:1)

这是最近在另一个问题precision error in nth root of a number in C++中观察到的(并且最近在code blocks power function is not working in c中)代码块的幂函数。 libing of mingw在准确性方面是次优的。在转换为(long long)整数之前使用round来解释exp(y*ln(x))作为pow(x,y)的实现的有限精度。

(long long int)round(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,因此不需要在代码中使用此函数。

答案 1 :(得分:-1)

您需要为变量分配内存

long *qrr;

qrr = (long*) malloc(q*sizeof(long));

编辑(其他猜测)

尝试两者:

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

我想这里发生了一些事情,您的1/3被解释为0