Zum alzaimar-Code - ein Vorschlag und drei Bugs:
V: Wenn man schon für die einmalige Abfrage (abs(n) > sqrt(Math.MaxDouble)) eine eigene Funktion spendiert: IsAPositiveAndVeryLargeNumber sollte dann doch besser IsAVeryLargeNumber heißen, da ja abs(n) getestet wird. (Wieso eigentlich 'n'?)
B1: Außerdem ist die sqrt(MaxDouble)-Logik noch nicht richtig implementiert. Mit s=sqrt(MaxDouble) hat x^2 +s + s^2 = 0, d.h. a=1, b=s, c=s^2, angeblich 2 relle Lösungen, leider allerdings beide =NAN in der
IDE,
Exception außerhalb. Tatsächlich gibt es, wie man leicht nachrechnet, zwei konjugiert komplexe Lösungen x1,x2 = 0.5*(1 +/- sqrt(3)*i)*s.
B2: Weiter hat x^2 - 1e160*x + 0 = 0 angeblich die Lösungen x1=x2=1e160, richtig ist x=1e160, x2=0.
B3: Und wiedermal das unsägliche iszero-Problem, das wir eigentlich schon ad acta gelegt hatten: Der Code weigert sich die Lösungen x1=1, x2=2 von (rx)^2 - 3r(r*x) + 2r^2 = 0 zu berechnen für abs(r) <= 1e-6.
Noch eine Bemerkung zu Daniels "Compiler-Direktiven wie $REGION, die für das eigentliche Problem völlig irrelevant sind." In dem Codelib-Beitrag bitte bitte entfernen, da sie ja offensichtlich irrelevant sind, aber zumindest bis Delphi 10 das Kompilieren verhindern.
Gruß Gammatester