Zum Inhalt springen

Java 64-bit bug?


speedi

Empfohlene Beiträge

Kann mir jemand sagen, wieso die Runtime crasht wenn ich den folgenden Code in einer 64-Bit-Runtime laufen lasse? Unter 32-bit funktionierts Problemlos.

public class LegendreTable {

  // These are the Gauss-normalized associated Legendre functions -- that

  // is, they are normal Legendre functions multiplied by

  // (n-m)!/(2n-1)!! (where (2n-1)!! = 1*3*5*...*2n-1)

  public final float[][] mP;


  // Derivative of mP, with respect to theta.

  public final float[][] mPDeriv;


  /**

   * @param maxN

   *          The maximum n- and m-values to support

   * @param thetaRad

   *          Returned functions will be Gauss-normalized P_n^m(cos(thetaRad)), with thetaRad in radians.

   */

  public LegendreTable(int maxN, float thetaRad) {

    // Compute the table of Gauss-normalized associated Legendre

    // functions using standard recursion relations. Also compute the

    // table of derivatives using the derivative of the recursion

    // relations.

    float cos = (float) Math.cos(thetaRad);

    float sin = (float) Math.sin(thetaRad);


    mP = new float[maxN + 1][];

    mPDeriv = new float[maxN + 1][];

    mP[0] = new float[] { 1.0f };

    mPDeriv[0] = new float[] { 0.0f };

    for (int n = 1; n <= maxN; n++) {

      mP[n] = new float[n + 1];

      mPDeriv[n] = new float[n + 1];

      for (int m = 0; m <= n; m++) {

        if (n == m) {

          mP[n][m] = sin * mP[n - 1][m - 1];

          mPDeriv[n][m] = cos * mP[n - 1][m - 1] + sin * mPDeriv[n - 1][m - 1];

        } else if (n == 1 || m == n - 1) {

          mP[n][m] = cos * mP[n - 1][m];

          mPDeriv[n][m] = -sin * mP[n - 1][m] + cos * mPDeriv[n - 1][m];

        } else {

          assert n > 1 && m < n - 1;

          float k = ((n - 1) * (n - 1) - m * m) / (float) ((2 * n - 1) * (2 * n - 3));

          mP[n][m] = cos * mP[n - 1][m] - k * mP[n - 2][m];

          mPDeriv[n][m] = -sin * mP[n - 1][m] + cos * mPDeriv[n - 1][m] - k * mPDeriv[n - 2][m];

        }

      }

    }

  }


  public static void main(String[] args) {

    while (true) {

      System.out.println(new LegendreTable(5, 0.5f));

    }

  }

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Unter Mac OS X:


Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-11D50)

Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)

stirbt es auch

LegendreTable@5c1428ea

Invalid memory access of location 0x0 rip=0x0

Segmentation fault: 11

Außer es wird mit java -d32 LegendreTable aufgerufen. Mehr kann ich dir leider gerade auch nicht sagen, hatte allerdings schon ein Threading Problem das z.B. zwischen verschiedenen Hostbetriebssysteme aufgetreten ist... Was mir noch aufgefallen ist mit: java -Xint -d64 LegendreTable funktioniert es auch wieder.

  -Xint               Operates in interpreted-only mode.  Compilation  to

                           native code is disabled, and all bytecodes are exe-

                           cuted by the interpreter.  The performance benefits

                           offered  by the Java HotSpot VMs' adaptive compiler

                           will not be present in this mode.

Ich würde sagen das du einen Bug in der jvm gefunden hast. Müsstest halt jetzt mal sehen was für Code wirklich erzeugt wird und welche Optimierungen dann noch laufen, vielleicht erfolgt eine HotSpot Optimierung der Schleife die ungültig ist...

Bearbeitet von Wodar Hospur
Link zu diesem Kommentar
Auf anderen Seiten teilen

Nur zur Info, mit folgender Umstellung des Codes crasht es unter Win7 64bit nicht mehr:


public class LegendreTable {

  // These are the Gauss-normalized associated Legendre functions -- that

  // is, they are normal Legendre functions multiplied by

  // (n-m)!/(2n-1)!! (where (2n-1)!! = 1*3*5*...*2n-1)

  public final float[][] mP;


  // Derivative of mP, with respect to theta.

  public final float[][] mPDeriv;

  public final int maxN;

  public final float thetaRad;

  /**

   * @param maxN

   *          The maximum n- and m-values to support

   * @param thetaRad

   *          Returned functions will be Gauss-normalized P_n^m(cos(thetaRad)), with thetaRad in radians.

   */

  public LegendreTable(int maxN, float thetaRad) {

      this.maxN=maxN;

      this.thetaRad = thetaRad;

      mP = new float[maxN + 1][];

      mPDeriv = new float[maxN + 1][];

  }

  public void calc(){

    // Compute the table of Gauss-normalized associated Legendre

    // functions using standard recursion relations. Also compute the

    // table of derivatives using the derivative of the recursion

    // relations.

    float cos = (float) Math.cos(thetaRad);

    float sin = (float) Math.sin(thetaRad);



    mP[0] = new float[] { 1.0f };

    mPDeriv[0] = new float[] { 0.0f };

    for (int n = 1; n <= maxN; n++) {

      mP[n] = new float[n + 1];

      mPDeriv[n] = new float[n + 1];

      for (int m = 0; m <= n; m++) {

        if (n == m) {

          mP[n][m] = sin * mP[n - 1][m - 1];

          mPDeriv[n][m] = cos * mP[n - 1][m - 1] + sin * mPDeriv[n - 1][m - 1];

        } else if (n == 1 || m == n - 1) {

          mP[n][m] = cos * mP[n - 1][m];

          mPDeriv[n][m] = -sin * mP[n - 1][m] + cos * mPDeriv[n - 1][m];

        } else {

          assert n > 1 && m < n - 1;

          float k = ((n - 1) * (n - 1) - m * m) / (float) ((2 * n - 1) * (2 * n - 3));

          mP[n][m] = cos * mP[n - 1][m] - k * mP[n - 2][m];

          mPDeriv[n][m] = -sin * mP[n - 1][m] + cos * mPDeriv[n - 1][m] - k * mPDeriv[n - 2][m];

        }

      }

    }

  }


  public static void main(String[] args) {

    while(true){

      LegendreTable t = new LegendreTable(5,0.5f);

      System.out.println(t);

      t.calc();

    }

  }

Bin mir zwar auch nicht sicher, wo die eigentliche Ursache des Crashs liegt, aber es ist natürlich generell keine gute Idee, aufwändige Berechnungen im Konstruktor laufen zu lassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...