Zeitüberschreitung bei eval() Rechnung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zeitüberschreitung bei eval() Rechnung

    Hi
    Ich habe von meinem Lehrer den Auftrag bekommen, die Intervallverschachtelung für PHP zu machen.
    Hab mich hingesetzt und der Code sollte meiner Meinung nach funktionieren.
    Doch des Problem ist, bei eval("\$erga = $stra;"); bleibt mir des Script immer hängen und überschreitet das Zeitlimit von 30 Sekunden.
    Dass Ganze ist HIER zu erreichen!

    Eingaben sind zum Beispiel diese:
    f(x) = x-1
    a = -1
    b = 2

    Quellcode

    1. <?php
    2. /* Variablen:
    3. * $var = Zahl mit unbekanntem Vorzeichen
    4. */
    5. function sign($var) {
    6. if($var >= 0) {
    7. return "+";
    8. }else{
    9. return "-";
    10. }
    11. }
    12. /* Variablen:
    13. * $a = Intervalanfang
    14. * $b = Intervalende
    15. * $c = Stellen
    16. */
    17. function stellentest($a, $b, $c) {
    18. // Alle $c Stellen auf Genauigkeit prüfen
    19. for($i=0;$i<=$c-1;$i++) {
    20. if(substr($a, $i) == substr($b, $i)) {
    21. $j = $i;
    22. }else{
    23. break 2;
    24. }
    25. }
    26. // Wenn alle Stellen gleich waren true, sonst false
    27. if($j == $c) {
    28. return true;
    29. }else{
    30. return false;
    31. }
    32. }
    33. /* Variablen:
    34. * $var = Term
    35. * $a = a
    36. * $a = b
    37. */
    38. function rechne($var, $a, $b) {
    39. // 1. Startwerte
    40. $stra = @str_replace("x",$a,$var);
    41. $strb = @str_replace("x",$b,$var);
    42. @eval("\$erga = $stra;");
    43. @eval("\$ergb = $strb;");
    44. // 2. Prüfen ob alle Variablen vorhanden sind
    45. if(!isset($var, $a, $b) OR $var == "" OR $a == "" OR $b == "" OR $var == "Term" OR $a == "a" OR $b == "b") {
    46. return "Bitte f&uuml;llen sie alle Felder aus!";
    47. // 3. Prüfen ob a und b Zahlen sind
    48. }elseif(!is_numeric($a) OR !is_numeric($b)) {
    49. return "Bitte geben Sie nur Zahlen an!";
    50. // 4. Prüfen ob nur x vorhanden ist (Sicherheitsrisiko ausschließen)
    51. }elseif(eregi("[a-w]", $var) OR eregi("[y-z]", $var)) {
    52. return "Bitte verwenden Sie nur die Variable x!";
    53. // 5. Prüfen ob a und b gleiches Vorzeichen haben
    54. }elseif(($erga < 0 AND $ergb < 0) OR ($erga > 0 AND $ergb > 0)) {
    55. return "Die beiden Grenzen haben das gleiche Vorzeichen<br />\n-> Nullstelle kann nicht berechnet werden!";
    56. // 6. Intervallschachtelung
    57. }else{
    58. while($i != "break") {
    59. // a) Mittelwert berechnen
    60. $h = ($a + $b) / 2;
    61. // b) Zahlenwert für x einsetzten
    62. $stra = str_replace("x",$a,$var);
    63. $strb = str_replace("x",$b,$var);
    64. $strh = str_replace("x",$h,$var);
    65. // c) Funktionen berechnen
    66. eval("\$erga = $stra;");
    67. eval("\$ergb = $strb;");
    68. eval("\$ergh = $strh;");
    69. // d) Vorzeichen prüfen und betreffende Variable austauschen
    70. if(sign($erga) == "-") {
    71. if(sign($strh) == "-") {
    72. $a = $ergh;
    73. }else{
    74. $b = $ergh;
    75. }
    76. }else{
    77. if(sign($strh) == "-") {
    78. $b = $ergh;
    79. }else{
    80. $a = $ergh;
    81. }
    82. }
    83. // e) Auf Genauigkeit testen
    84. $testa = explode(".", $a);
    85. $testb = explode(".", $b);
    86. // d) Wenn auf 6 Stellen genau, dann Abbruch
    87. if(stellentest($testa, $testb, 6)) {
    88. $i = "break";
    89. $erg = round($testa, 7);
    90. }
    91. }
    92. return "Nullstelle bei ".$erg;
    93. }
    94. }
    95. ?>
    Alles anzeigen


    Kann mir da wer helfen?

    Vielen Dank ihm Vorraus für die Mühe
    lu

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von venum-lk ()

  • Hi
    Die Ausgabe ist
    $erga = -2.49999999999;
    Und zwar unendlich mal :)

    Ich versteh aber nicht, wie er auf die Zahl kommt .. :D

    // EDIT:

    Quellcode

    1. <?php
    2. $var = "x-2*(x-(x*0.16))*(x+(x/14))";
    3. $a = -1;
    4. $b = 2;
    5. $stra = @str_replace("x",$a,$var);
    6. $strb = @str_replace("x",$b,$var);
    7. @eval("\$erga = $stra;");
    8. @eval("\$ergb = $strb;");
    9. echo "f(x) = ".$var."<br />";
    10. echo "a = ".$a." -> ".$erga."<br />";
    11. echo "b = ".$b." -> ".$ergb;
    12. ?>
    Alles anzeigen

    Das gibt mir komischerweiße ohne Probleme die Ergebnisse aus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von venum-lk ()

  • Problem gelöst!
    Es lag nicht an eval, sondern daran, dass die Schleife einfach zu oft gelaufen ist.
    Ich hab sie jetzt auf 1000x beschränkt und schon funktioniert es :)
    Vielen Dank für eure Hilfe!

    Für die, die den Code wollen, oder sich des Ganze einfach nur anschauen wollen, HIER KLICKEN.

    MfG
    dalu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von venum-lk ()