宏观方程给出虚假价值?

时间:2015-01-15 15:12:15

标签: c

当我运行我的代码时,对于Y,我始终得到值-2147483648,无论y被输入到我的等式中是什么值。

这是我的代码。

#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;
    }
}

在查看我的代码之后,我意识到我的问题是我的&#34; int x = sqrt(value)&#34;。除了&#34;值&#34;的问题变量是一个int,当然,由于检查的目的是评估(2 *(pow(y,4)))+ 1)是否返回一个完美的整个正方形,因此仍然会返回一个虚假值对于y的任何给定值,由于检查中的变量x(double值)是数据类型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;
}

阅读评论是我的代码的顶部,这个选择的目的应该非常明显。

4 个答案:

答案 0 :(得分:2)

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

由于表达式评估期间的类型提升,表达式为:

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

将给出一个double值,你将它存储在整数类型中,这将产生意想不到的结果。

答案 1 :(得分:2)

您没有double pow(double, double);的原型,因此编译器会隐式假设其签名为int pow(int, int);。不好!<​​/ p>

解决方法是#include .c文件顶部的相应标题。

#include <math.h>

确保启用警告,如果已经启用警告,请注意它们!您的编译器应警告您缺少原型。 (它还应该为printf吐出类似的警告。)

答案 2 :(得分:0)

这是pow

的声明
double pow(double x, double y)

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

答案 3 :(得分:0)

参考您更新的问题,这一行:

if(x = check(i) > 0)

需要括起来:

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