Java 第一个调用方法中的语句不会按原样运行

Java 第一个调用方法中的语句不会按原样运行,java,Java,这是我的密码 import java.lang.Math; public class Demo { // inputs are declared private int x[]={1,0,1,0}; //weights are declared private double w[]={0.4,0.6,0.7,0.8}; private double temp; private double z=0; private int desir

这是我的密码

import java.lang.Math;

public class Demo {

    // inputs are declared
    private int x[]={1,0,1,0};
    //weights are declared
    private double w[]={0.4,0.6,0.7,0.8};
    private double temp;

    private double z=0;
    private int desiredOutput=0;

    private double actualOutput=0;
    private double error=0;
    private double definedValue=0.004;
    private double weightChange[]={0,0,0,0};
    private double learningRate=0.7;

    public void calculate(){
        System.out.println("hi");

        for(int i=0; i<w.length; i++){
            temp=0;
            temp=x[i]*w[i];
            z+=temp;
            System.out.println("Z value"+z);
        }

        actualOutput=1/(1+Math.exp(-z));

        System.out.println("actualOutput "+actualOutput);

        if(actualOutput!=desiredOutput){
            calculateError();
        }
        else{
            printWeights();
        }
    }
    public void calculateError(){
        error=0.5*(desiredOutput-actualOutput)*(desiredOutput-actualOutput);
        System.out.println("error "+error);
        checkingCondition();
        //error=0.003;
    }
    public void checkingCondition(){
        if(error<definedValue){
            printWeights();
        } else {
            balanceWeights();
        }
    }

    public void balanceWeights(){
        for(int i=0;i<w.length;i++){

            weightChange[i]=((-learningRate)*(desiredOutput-actualOutput)*actualOutput*(1-actualOutput)*x[i]);
            System.out.println(weightChange[i]);
            w[i]=w[i]+weightChange[i];
        }
        calculate();
    }

    public void printWeights(){
        System.out.print("The balanced weights are:");

        for(int i=0;i<4;i++){
            System.out.print(w[i]+"\t");
        }    
    }
}
但在不打印“hi”的情况下,编译器会执行在第一个调用方法中调用的其他方法,并在下一个调用中打印“hi”。我使用“hi”来检查运行的第一个方法上的运行路径

这是我得到的输出的初始部分

Z value1543.3571456014363
Z value1544.2242990218328
Z value1544.2242990218328
actualOutput 1.0
error 0.5
0.0
0.0
0.0
0.0
hi
Z value1544.7914524422295
Z value1544.7914524422295
Z value1545.658605862626
Z value1545.658605862626
actualOutput 1.0
error 0.5
0.0
0.0
0.0
0.0
hi
Z value1546.2257592830226
Z value1546.2257592830226
Z value1547.0929127034192
Z value1547.0929127034192
actualOutput 1.0
error 0.5
0.0
0.0
0.0
0.0
hi
Z value1547.66006612
在输出的最后部分给出了这些误差

hi
Z value1861.77326425752
Z value1861.77326425752
Z value1862.6404176779165
Z value1862.6404176779165
actualOutput 1.0
Exception in thread "main" java.lang.StackOverflowError
    at sun.misc.FloatingDecimal$BinaryToASCIIBuffer.dtoa(FloatingDecimal.java:431)
    at sun.misc.FloatingDecimal$BinaryToASCIIBuffer.access$100(FloatingDecimal.java:259)
    at sun.misc.FloatingDecimal.getBinaryToASCIIConverter(FloatingDecimal.java:1785)
    at sun.misc.FloatingDecimal.getBinaryToASCIIConverter(FloatingDecimal.java:1738)
    at sun.misc.FloatingDecimal.appendTo(FloatingDecimal.java:89)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:709)
    at java.lang.StringBuilder.append(StringBuilder.java:226)
    at Neural4.Demo.calculateError(Demo.java:55)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)

为什么会发生这种情况,当变量
desiredOutput
设置为
1
时,代码运行正常,当设置为
0
时,问题就出现了。平衡重根本不应该调用calculate。它应该是(伪代码)


另外,将非整数与
==
组合将不起作用。请查看请检查
错误的值/计算/更新
,它在您的输出中为
0.5
,并且不会随时间变化(至少在显示的输出中)。这意味着您将反复转到
calculate()
calculateError()
checkingCondition()
balanceWeights()
calculate()
。这将导致给定的
堆栈溢出错误

您知道如何使用调试器吗?将浮点与
==
进行比较,您需要检查,感谢它成功。谢谢您,我没有看到,我用注释的链接解决了我的问题
hi
Z value1861.77326425752
Z value1861.77326425752
Z value1862.6404176779165
Z value1862.6404176779165
actualOutput 1.0
Exception in thread "main" java.lang.StackOverflowError
    at sun.misc.FloatingDecimal$BinaryToASCIIBuffer.dtoa(FloatingDecimal.java:431)
    at sun.misc.FloatingDecimal$BinaryToASCIIBuffer.access$100(FloatingDecimal.java:259)
    at sun.misc.FloatingDecimal.getBinaryToASCIIConverter(FloatingDecimal.java:1785)
    at sun.misc.FloatingDecimal.getBinaryToASCIIConverter(FloatingDecimal.java:1738)
    at sun.misc.FloatingDecimal.appendTo(FloatingDecimal.java:89)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:709)
    at java.lang.StringBuilder.append(StringBuilder.java:226)
    at Neural4.Demo.calculateError(Demo.java:55)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
    at Neural4.Demo.checkingCondition(Demo.java:68)
    at Neural4.Demo.calculateError(Demo.java:56)
    at Neural4.Demo.calculate(Demo.java:41)
    at Neural4.Demo.balanceWeights(Demo.java:84)
set initial weights();
    while(currentError>=required){
       checkConfitions();
       balanceWeigth();
       calculate();
    }