Guest User

Untitled

a guest
Jul 21st, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.16 KB | None | 0 0
  1. class Heron
  2. {
  3. public static double sqrt(final double arg)
  4. {
  5. // Wurzel aus negativer Zahl ergibt NaN
  6. if (arg < 0.0)
  7. return(0.0 / 0.0);
  8.  
  9. // sehr kleine Zahl, also etwa 0.0
  10. if (arg < 1E-100)
  11. return(0.0);
  12.  
  13. double temp = arg;
  14. double result = 1.0;
  15.  
  16. /*
  17. * Zuerst bringe man die Zahl in den Bereich 0.1 ... 1.0
  18. * Effizienter wäre natürlich ein direkter Zugriff auf
  19. * den Exponenten in der Gleitkomma-Darstellung, aber das
  20. * ist ein wenig Bit-Pfriemelei und ohne genaue Kenntnis
  21. * der Gleitkomma-Implementierung nicht möglich, deshalb hier
  22. * nur eine (hinsichtlich Laufzeit) schlechte Variante!
  23. */
  24.  
  25. // Solange Zahl > 1.0, dividiere sie durch 10.0 und
  26. // multipliziere Startwert mit sqrt(10.0)
  27. while (temp > 1.0)
  28. {
  29. temp /= 10.0;
  30. result *= sqrt10;
  31. }
  32.  
  33. // Solange Zahl < 0.1, multipliziere sie mit 10.0 und
  34. // dividiere Startwert durch sqrt(10.0)
  35. while (temp < 0.1)
  36. {
  37. temp *= 10.0;
  38. result /= sqrt10;
  39. }
  40.  
  41. // Startwert mittels Tabelle schätzen
  42. result = result * start[(int) (temp * 10.0)];
  43.  
  44. // Iteration mit fester Anzahl schritten
  45. for (int i = 1; i <= 4; i++)
  46. result = (result + arg / result) * 0.5;
  47.  
  48. return(result);
  49. }
  50.  
  51. public static void sqrtTest(final double arg)
  52. {
  53. double result = sqrt(arg);
  54. System.out.printf("%e ^ 2 = %e : relativer Fehler %e\n", result, arg,
  55. Math.abs((result * result - arg) / arg));
  56. }
  57.  
  58. private static final double sqrt10 = Math.sqrt(10.0);
  59.  
  60. private static final double[] start =
  61. {
  62. Math.sqrt(0.1), Math.sqrt(0.2), Math.sqrt(0.3), Math.sqrt(0.4),
  63. Math.sqrt(0.4), Math.sqrt(0.6), Math.sqrt(0.7), Math.sqrt(0.8),
  64. Math.sqrt(0.9), Math.sqrt(1.0),
  65. Math.sqrt(1.0) // Zugriff außerhalb Arraygrenzen absichern
  66. };
  67.  
  68. public static void main(String[] args)
  69. {
  70.  
  71. double x;
  72. for (int i = 1; i <= 100; i += 2)
  73. {
  74. x = i * (11.0 / 700.0) * (1 << (i / 10));
  75. // Berechne näherungsweise Quadratwurzel aus x und den relativen Fehler
  76. sqrtTest(x);
  77. }
  78. }
  79.  
  80. };
Add Comment
Please, Sign In to add comment