2015-01-15 59 views
0

当我运行我的代码时,对于Y,我总是得到值-2147483648,而不管我的公式中输入了什么值。宏观方程给假价值?

这是我的代码。

#define MAX       1000 
#define EQ(y)   ((2*(pow(y, 4)))+1) 

int check(int value); 

int main() 
{ 
    int i, y, x; 
    for(y = 1; y < MAX; y++) 
    { 
     i = EQ(y); 
     if(check(i)) 
      printf("combination found: x = %d, y = %d", sqrt(i), y); 
    } 
} 

int check(int value) 
{ 
    int x = sqrt(value); 
    if ((x*x) == value) 
     return 1; 
    else 
    { 
     return 0; 
    } 
} 

审查我的代码后,我意识到我的问题是我的 “INT X =开方(值)”。除了“值”变量是一个整数的问题,当然由于检查的目的是评估是否(2 *(pow(y,4))),所以仍然返回一个假的值)+1)为任何给定的y值返回了一个完美的整数正方形,并且由于变量x(checkval(double value))是数据类型integer,所以这是不可能的。

更新:我重写了我的代码,如下所示。我还没有得到任何正确的报税表

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

/* 
* the solution I implemented basically involved dropping x from the equation, solving for y, checking to see if it has a 
* perfect square root. if it does, then x = the squareroot of y in the function EQ. 
* original problem: for equation x^2 - 2y^4 + 1 = 0, find all possible solutions up to  arbitrary maximum 
*/ 

#define MAX      100000 
#define EQ(g)   (((pow(g, 4.0)))+1) 

int check(double value); 

int main() 
{ 
    int y, x; 
    double i; 
    for(y = 1; y < MAX; y++) 
    { 
     i = EQ(y); 
     if(x = check(i) > 0) 
      printf("combination found: x = %d, y = %d\n", y, x); 
    } 
} 

int check(double value) 
{ 
    double x = sqrt(value); 
    int n = (int) x; 
    printf("%d\n%f\n%f\n", n*n, value, x); 
    if (n*n == value) 
     return n*n; 
    else 
     return 0; 
} 

阅读评论是我的代码的顶部,并选择用的目的应该是很明显的。

+0

如果你需要一个'POW()'函数与整数作品,[使用](http://stackoverflow.com/a/101613/1679849)。 – 2015-01-15 15:20:51

+0

'2 * pow(1000,4)'不适合'int';它有41个二进制数字。而你正在使用错误的格式说明符。 – molbdnilo 2015-01-15 15:25:43

回答

0

关于你更新的问题,这条线:

if(x = check(i) > 0) 

需要被加上括号:

if((x = check(i)) > 0) 
2

pow()返回double,并且您使用整数i来存储返回值。

由于推广型表达式计算过程的表达:

((2*(pow(y, 4)))+1) 

会给双重价值,你是在整数类型,这将给意想不到的结果存储这一点。

+0

这不是意想不到的结果,它预计最终**溢出整数。 – 2015-01-15 15:16:49

+0

@iharob;这将导致意想不到的结果。 – haccks 2015-01-15 15:17:55

+0

@iharob对不起,为什么我会得到这个投票呢? – Gopi 2015-01-15 15:20:06

2

您没有double pow(double, double);的原型,因此编译器隐式假定其签名为int pow(int, int);。不好!

解决的办法是在.c文件顶部的#include适当的标题。

#include <math.h> 

请确保您启用了警告,并且如果它们已经启用,请关注它们!您的编译器应该警告您关于丢失的原型。 (还应该吐出用于printf了类似的警告。)

+0

我经常看到这个问题,我认为人们应该学会如何调用他们的编译器来防止这个愚蠢的错误。而且我从来没有想到有人忘记包含任何头文件,因为我的程序在这种情况下不会编译。 – 2015-01-15 15:20:16

+0

这是一个很好的答案,但我没有忘记标题。我只包含产生错误的代码;还有更多的运行顺利。我包含math.h并且有一个原型,并且在GCC中使用-lm链接它。 – h3xc0ntr0l 2015-01-15 17:14:59

0

这是pow声明:

double pow(double x, double y) 

这意味着它在double工作。通过使用int代替,变量y溢出。