2016-06-23 16 views
0

Ich schreibe gerade eine "neue Sprache" in der Schule, und ich muss eine Math-Klasse implementieren.ULP Berechnung Gleitkomma

Eine der Spezifikationen ist Ulp-Methode wie Math.ulp() in Java zu implementieren. Wir arbeiten an Float-Typen.

ich viele interessante Quellen gefunden, aber ich bin immer noch ..

AFAIK, wenn

normalized x

dann

ulp equation

nicht in der Lage ULP eines Schwimmers zu berechnen

Aber wie kann ich diese normalisierte Form für ein Float ohne Lib erhalten? Und wie erhält man Parameter e & n + 1?

Vielen Dank für Ihre Hilfe,

Mit freundlichen Grüßen,

Antwort

2

Ich bin nicht sicher, ob Java die Möglichkeit des Aliasing hat das Bitmuster der Gleitkommazahl (es gibt eine nahe genug Alternative zu bekommen, wie der zweite Teil der Antwort zeigt), aber wenn es das tut, dann ist e die Bits 23 bis 30 (31 ist Vorzeichen) abzüglich einer Konstante (wie in , es ist 127, außer die Zahl ist subnormal), während n fest ist (in In diesem Fall ist es 23 Bit oder 24, wenn es die implizite enthält 1)

Es wird empfohlen, Sie verwenden eine lib, die dies tut j ob für dich richtig.

Eine andere Option, die mir in den Kommentaren von (eher indirekt) mitgeteilt wurde, impliziert das Konvertieren der Gleitkomma-Bits in int. Ich werde ein Code-Snippet direkt schreiben. Ich bin nicht vollständig mit Java vertraut (der Code funktioniert möglicherweise nicht sofort aufgrund fehlender Paket/Klassen-Spezifizierer (floatToIntBits sowie intToFloatBits sind statische Methoden der Klasse java.lang.Float). Dies unterscheidet sich von dem obigen Vorschlag, da es ist ein wenig unorthodox, aber es eine bessere Leistung als der Code hat man sich in der Frage vorgeschlagen.

float ulp(float x) { 
    int repr; 
    float next; 
    if (Float.isNaN(x)) return Float.NaN; //special handling, to be safe 
    repr = Float.floatToIntBits(x); 
    x++; //will work correctly independently of sign 
    next = Float.intBitsToFloat(repr) 
    return next-x; 
} 
+0

https://docs.oracle.com/javase/7/docs/api/java/lang/Float.html# floatToIntBits (float) – Mysticial

+1

Bits: Vorzeichen + Mantisse + Exponent Und Mantisse ++ gibt die nächste Gleitkommazahl für den gleichen Exponenten –

+0

Ich hatte eine andere Alternative, wenn die Sprache C verwandt ist (der Kommentar von @Mysticial erlaubt das tatsächlich) –