Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Heron
- {
- public static double sqrt(final double arg)
- {
- // Wurzel aus negativer Zahl ergibt NaN
- if (arg < 0.0)
- return(0.0 / 0.0);
- // sehr kleine Zahl, also etwa 0.0
- if (arg < 1E-100)
- return(0.0);
- double temp = arg;
- double result = 1.0;
- /*
- * Zuerst bringe man die Zahl in den Bereich 0.1 ... 1.0
- * Effizienter wäre natürlich ein direkter Zugriff auf
- * den Exponenten in der Gleitkomma-Darstellung, aber das
- * ist ein wenig Bit-Pfriemelei und ohne genaue Kenntnis
- * der Gleitkomma-Implementierung nicht möglich, deshalb hier
- * nur eine (hinsichtlich Laufzeit) schlechte Variante!
- */
- // Solange Zahl > 1.0, dividiere sie durch 10.0 und
- // multipliziere Startwert mit sqrt(10.0)
- while (temp > 1.0)
- {
- temp /= 10.0;
- result *= sqrt10;
- }
- // Solange Zahl < 0.1, multipliziere sie mit 10.0 und
- // dividiere Startwert durch sqrt(10.0)
- while (temp < 0.1)
- {
- temp *= 10.0;
- result /= sqrt10;
- }
- // Startwert mittels Tabelle schätzen
- result = result * start[(int) (temp * 10.0)];
- // Iteration mit fester Anzahl schritten
- for (int i = 1; i <= 4; i++)
- result = (result + arg / result) * 0.5;
- return(result);
- }
- public static void sqrtTest(final double arg)
- {
- double result = sqrt(arg);
- System.out.printf("%e ^ 2 = %e : relativer Fehler %e\n", result, arg,
- Math.abs((result * result - arg) / arg));
- }
- private static final double sqrt10 = Math.sqrt(10.0);
- private static final double[] start =
- {
- Math.sqrt(0.1), Math.sqrt(0.2), Math.sqrt(0.3), Math.sqrt(0.4),
- Math.sqrt(0.4), Math.sqrt(0.6), Math.sqrt(0.7), Math.sqrt(0.8),
- Math.sqrt(0.9), Math.sqrt(1.0),
- Math.sqrt(1.0) // Zugriff außerhalb Arraygrenzen absichern
- };
- public static void main(String[] args)
- {
- double x;
- for (int i = 1; i <= 100; i += 2)
- {
- x = i * (11.0 / 700.0) * (1 << (i / 10));
- // Berechne näherungsweise Quadratwurzel aus x und den relativen Fehler
- sqrtTest(x);
- }
- }
- };
Add Comment
Please, Sign In to add comment