C中的求值函数为负

问题描述 投票:0回答:2

我正在使用Java 11,Eclipse IDE。我正在设计一个需要一些计算的程序,我正在用Java编写该程序,因此我试图找到类似于一个名为“ eval()”的函数,该函数可以计算方程式。因此,我用C实现了该功能,并将其转换为“ .dll”文件,并在Java中使用了它。

我的主要问题是,当我将方程式传递给eval函数时,它返回一个负数且非常大的double,就像:我传递给它的“ 1.0 + 0.5 ^ 2”,结果是“ -9.255963134931783E61”,这样的结果是不可能的!

注意:它总是返回正确的结果,但是在最后执行时,它返回了上面的结果!为什么?怎么样?我正在使用相同的eval函数。

我只会向您展示重要的部分,其余部分则不重要:

所有代码:

eval.c:

int evaluate(char* line, double* val);
static int do_op(void);
static int do_paren(void);
static void push_op(char op);
static void push_arg(double arg);
static STATUS pop_arg(double* arg);
static STATUS pop_op(int* op);
static char* getexp(char* str);
static char* getop(char* str);
static char* getop(char* str);
JNIEXPORT jdouble JNICALL Java_application_Main_eval
(JNIEnv* env, jobject object, jstring str) {
    const char* strs = env->GetStringUTFChars(str, false);
    char* equation = const_cast<char*>(strs);
    double result;
    evaluate(equation, &result);
    printf("the result is : %f", result);
    jdouble* returnResult = new jdouble(result);
    return *returnResult;
}

java中的本机eval方法:

static {
    System.load(System.getProperty("user.dir")+"\\eval.dll");
}
public native double eval(String equation);

最终导致奇怪的java方法:

String evaluateEquation(String e) {
        // we will truncate the brackets into pieces and eval every piece, 
        // and then return it without brackets by replacing it inside the equation!
        StringBuilder equation = new StringBuilder(e);
        int count = countBrackets(equation);
        int[] pos;
        String part;
        String result;
        // TODO : fix here : 
        BigDecimal tempResult = new BigDecimal(0);
        while (count!=0) { // every one loop, it will truncate, evaluate, replace the new value!
            pos = lastBrackets(equation.toString());
            part = equation.substring(pos[0], pos[1]+1);
            System.out.println("evaluating this part : "+part);
            tempResult = new BigDecimal(new Main().eval(part));
            System.out.println(tempResult.toString());
            result = truncateDecimals(tempResult);
            equation.replace(pos[0], pos[1]+1, result);
            System.out.println(equation.toString());
            count--;
        }
        System.out.println(equation.substring(0, equation.length()));
        part = equation.substring(0, equation.length()-1);
        finalResult = new BigDecimal(new Main().eval(part));
        System.out.println("FinalResult is : "+truncateDecimals(finalResult));
        return truncateDecimals(finalResult);
    }

如果您已经阅读了“ eval.c”程序,您会注意到它需要一个“ char *”和一个“ double&”。我已经处理了这些转换,并且我认为它们与该错误有关。该方法总是返回正确的结果,除了在“ evaluateEquation”方法末尾的一个地方。

根据我的了解,只有当我们将其更改为负数时,计算机内存中存储的任何数字才会变为负数,否则它将扩展为要存储的最大数。如果数字超出限制,它将变为负数。但是,我发现,每次我在“ evaluateEquation”函数末尾调用eval函数时,都会一次又一次重复负数,结果是相同的,即:“-9.255963134931783E61”。如果您有任何假设,解释或其他任何内容。请随便聊。我永远不会拒绝任何试图帮助我的人。

注意:这是我用来制作dll文件的原始C代码:http://stjarnhimlen.se/snippets/eval.c

我正在使用Java 11,Eclipse IDE。我正在设计一个需要一些计算的程序,我正在用Java编写该程序,因此我试图找到类似于名为“ eval()”的函数,...

java c math double eval
2个回答
1
投票

数字-9.255963134931783E61具有内部表示0xCCCCCCCCCCCCCCCC,强烈表示它是未初始化的值。


0
投票

我已经注意到代码缺少某些内容。我对其进行了修改,并记得该程序启动时dll文件仅加载一次,因此所有变量均被删除或清除。这导致返回的值是奇数,并在使用的数组已满后连续重复。因此,我创建了一个函数来清除:

© www.soinside.com 2019 - 2024. All rights reserved.