Dieser Artikel wurde maschinell übersetzt.

Numerics

Testen mathematischer Funktionen in Microsoft Cloud Numerics

Stuart Brorson  

Genommen Sie an, Sie müssen eine mathematische Berechnung durchführen. Z. B. genommen Sie an, Sie den Sinus von 34 ° wissen müssen. Was machst du? Sie wenden sich vermutlich an einen Taschenrechner, Computer oder einige andere intelligente Geräte. Auf Ihrem Gerät Sie in "sin(34)" eingeben, und Sie erhalten eine Antwort, oft mit 16 Dezimalstellen Genauigkeit. Aber woher wissen Sie, dass Ihre Antwort richtig ist?

Wir sind so daran gewöhnt, immer mathematische Antworten aus unserer elektronischen Dinge, dass niemand denkt darüber nach, ob die Antworten richtig sind! Nur etwa jeder nimmt es als selbstverständlich, dass unsere Maschinen uns die richtigen Antworten geben. Jedoch kann nicht für eine kleine Gruppe von Software-Qualität-Ingenieure, Korrektheit als Selbstverständlichkeit betrachtet werden; der Job ist alles über die richtige Antwort bekommen. Dieser Artikel beschreibt, wie die mathematischen Funktionen in der neuen Microsoft Cloud Numerik-Mathematik-Bibliothek getestet werden.

Die meisten wissenschaftliche und technische Berechnungen verwenden Gleitkomma-Arithmetik. IEEE standardisiert die grundlegenden Tätigkeiten von Gleitkommaoperationen 1985. Ein Hauptmerkmal des Standards ist, dass es nicht anerkennt, dass alle Zahlen auf einem Computer dargestellt werden können. Während die Menge der reellen Zahlen unendlich und unzählige ist, ist der Satz von IEEE Gleitkommazahlen notwendigerweise endlichen und zählbar, da die numerische Darstellung von Gleitkommazahlen eine feste Anzahl von Bits verwendet. Der Bau von IEEE Gleitkommazahlen impliziert, dass sie auch rational, also häufig verwendete Nummern sind, wie z. B. π sind nicht genau ausgedrückt und Operationen mit ihnen, z. B. sin(x), sind nicht exakt, entweder.

Außerdem im Gegensatz zu mit Ganzzahlen, der Abstand zwischen IEEE Gleitkommazahlen ist lokal einheitlich, sondern es nimmt logarithmisch mit der Größenordnung der Zahl selbst. Dieser logarithmischen Aspekt ist abgebildet Abbildung 1, die zeigt schematisch die Lage der einheitliche Brocken von IEEE Gleitkommazahlen an vorderster reelle Zahl. In der Abbildung sind gültige Brocken von Gleitkommazahlen (eingebettet in die reelle Zahl-Linie) durch vertikale Linien angezeigt. Anmerkung, die den Abstand zwischen gültigen Gleitkommazahlen logarithmisch als das Ausmaß der x erhöht erhöht. Der Abstand zwischen zwei benachbarten Gleitkommazahlen wird oft als die Einheit der geringsten Präzision oder Einheit im letzten Platz (ULP), und dient als eine integrierte Funktion, die aufgerufen eps(x) in vielen gemeinsamen Math-Programmen. Eine Folge der Veränderung der Abstand ist, dass eine kleine Anzahl nahe 0 keine Wirkung, wenn eine relativ größere Zahl wie 1 hinzugefügt.

The Floating-Point Number Grid Depicted Schematically
Abbildung 1 die Gleitkommazahlen Zahlenfeld schematisch dargestellt

Neben Kodifizierung Formate für Gleitkommazahlen, bietet der IEEE-Standard strenge Anleitung darüber, wie genau die Erträge aus den meisten grundlegenden mathematischen Operationen sein müssen. Der IEEE-Standard gibt z. B. die Erträge aus den vier arithmetischen Operationen (+, -, * und /) muss "am besten gerundet werden," Was bedeutet, dass die Antwort zurückgegeben werden muss am nächsten zum "mathematisch korrekt" Ergebnis. Obwohl mit einigem Widerstand ursprünglich diese Voraussetzung erfüllt war, findet nun das best-rounded Ergebnis zurückgeben in Hardware, die zeigen, wie alltäglich geworden ist. Interessanter, erfordert die Gleitkommazahlen IEEE-Spezifikation auch, dass die Quadratwurzel-Funktion das best-rounded Ergebnis zurück. Dies ist interessant, weil es die Tür zu zwei Fragen öffnet: "Wie genau kann eine irrationale Funktion berechnet werden mit der IEEE-Gleitkommadarstellung?" und "Wie sollte Sie testen die Genauigkeit der Implementierung einer Funktion?"

Genaue Funktionen

Welche Faktoren bestimmen die Genauigkeit einer Berechnung eingehen? Die Realität ist, dass wir erwarten sollten, Ungenauigkeiten, zu begegnen, Rundungsfehler auftreten kann, in jedem Schritt in einem Algorithmus. Diese Fehler können zusammengesetzte, obwohl manchmal sie auch abbrechen können. In der Praxis muss ein Algorithmus-Designer lernen, Leben mit und die inhärente Ungenauigkeit des numerischer Berechnungen enthalten.

Sie können trennen die Faktoren, die zu computational Fehler in zwei Kategorien unterteilt:

  1. Faktoren, die im Zusammenhang mit den Algorithmus für die Berechnung durchführen. Dies bedeutet insbesondere der Stabilität des Algorithmus selbst und seine Sensibilität für runden Störungen. Ein armer, unstable-Algorithmus wird tendenziell weniger genaue Ergebnisse zurückgeben, während ein guter, stabiler Algorithmus mehr genaue Ergebnisse zurückgeben wird.
  2. Die Beschaffenheit der Funktion selbst und die Domäne seiner Eingänge. Es ist die theoretische Grenze die erreichbare Genauigkeit jeder Funktion-Implementierung, wenn Berechnung eine endliche (im Gegensatz zu einer unendlichen) Anzahl von Bits verwendet. Der Grund ist, dass Rundungsfehler verhält sich wie eine Quelle der Fehler in der Berechnung und das Verhalten der Funktion selbst bestimmt, ob dieser Fehler ist verstärkt oder abgeschwächt, da die Berechnung aus der Eingänge auf die Ausgänge Erlöse. Zum Beispiel Informatik Werte einer Funktion in der Nähe eine Singularität, eine NULL oder eine schnelle Oszillation möglicherweise weniger genau an diesen Punkten als Datenverarbeitung eine Funktion, die langsam über die gleiche Eingabe Domäne variiert. Wenn diese systeminterne erreichbare Genauigkeit zu sprechen, sprechen wir von wie "gut konditionierten" die Funktion ist.

Dementsprechend umfasst die Prüfung der Genauigkeit einer Funktion Implementierung überprüfen, dass der Algorithmus Ergebnisse so genau wie theoretisch möglich gibt. Die Grenzen der theoretische Möglichkeit sind durch die Konditionierung der Funktion auf jeder seiner Eingaben gegründet. Es stellt eine weitere Möglichkeit, anhand von Gleitkommazahlen um ein Ergebnis zu berechnen zwei mögliche Fehlerquellen: Fehler, die wir vermeiden können, indem gute, stabile Algorithmen (Faktor 1), und Störungen, die sind schwerer zu vermeiden, da sie mit der Funktion Verhalten an seinen Eingängen (Faktor 2) verwandt sind.

In der numerischen Mathematik ist das Konzept der Konditionierung quantifiziert, von den so genannten "Konditionszahl" mißt die Empfindlichkeit einer Funktion zu Variationen in seiner Eingänge. Je nach der genauen Art der Funktion unter Berücksichtigung (beispielsweise die Anzahl der Eingänge, skalare versus Matrix und So weiter) gibt es eine Reihe von komplizierten Ausdrücke für die Konditionszahl. Der einfachste Fall ist für eine differenzierbare Funktion einer Variablen, wie z. B. 1 / x, X 2, sin(x) oder die anderen Funktionen, die Sie wahrscheinlich bei High School Algebra gestoßen. In diesem einfachen Fall die Konditionszahl der Funktion f ist gegeben durch:

Equation 1
Gleichung 1

Wir werde bezeichnen dies später als Gleichung 1. Wie immer, die Notation f'(x) bedeutet die Ableitung der Funktion f. Etliche große Bedingung (Kf >> 1) hohe Lichtempfindlichkeit relative Perturbationen angibt, während eine kleine Zahl der Bedingung (Kf < = 1) angibt, die Funktion ist relativ unempfindlich gegen Störungen. Sie können intuitiv sehen, wenn eine Funktion eine Singularität hat — d. h. die Funktion explodiert, wie z. B. 1 / x nahe x = 0 — dieser Effekt zu erfassen und eine große Bedingung Retourennummer Derivat.

Betrachten Sie beispielsweise die Funktion f = 1/(1-x). Diese Funktion natürlich explodiert (d. h. wird unendlich) bei X = 1. Die Ableitung ist f'(x) = 1 /(1-x) 2. Einstecken dies in Gleichung 1 und Unterbindung Klauseln gibt die Konditionszahl für diese Funktion:

Die Konditionszahl Kf*(X)* geht bis unendlich um X = 1, was bedeutet, dass Berechnungen mit dieser Funktion empfindlich auf Störungen wie runden Fehler können beim x liegt in der Nähe 1. Da f bläst sich für X → 1, dieses Verhalten wird erwartet. Auch die Konditionszahl Kf (X) geht zu 0, wenn x nahe 0 ist. Dies bedeutet, dass die Berechnungen, die mit dieser Funktion werden unempfindlich gegen Störungen beim X → 0. Dies ist intuitives sinnvoll, weil f tendenziell einen konstanten Wert 1 bei x ist viel kleiner als 1.

Testen Funktion Genauigkeit

Was bedeutet eine praktische Prüfung der eine mathematische Funktion aussehen? Angenommen, wir möchten unsere Implementierung der skalaren Funktion testen y = f(x), wo x ist die Eingabe und y ist der Ausgabewert der zurückgegebenen. Einen Gleitkommawert Eingang gegeben x, testen drei Elemente erfordert:

  1. Der Wert berechnet, indem die Funktion unter Test, yberechnete = fberechnete*(X)*.
  2. Das "mathematisch wahre" Ergebnis. Übernehmen Sie, hatten wir ein Orakel, das uns die genaue, mathematisch korrekte Antwort sagen könnte. Runden Sie dann diesen Wert in die nächstgrößere Gleitkommawert (so dass es auf einem Computer dargestellt werden kann). Rufen Sie diesen Wert ywahren = fwahren*(X)*.
  3. Eine Prüfung Toleranz. Für einige Funktionen kann diese Toleranz 0, was bedeutet, dass die Ycomputed genau den mathematisch wahren Wert, Ytrue identisch ist. Beispielsweise die Gleitkommazahlen Spec Mandate, die die Funktion sqrt() gibt den Gleitkomma-Wert, der die genaue Antwort am nächsten liegt (d.h. best-rounded). Im allgemeinen Fall können wir jedoch nicht die Erträge aus alle Funktionen der best-rounded Annäherungen an ihre genaue Werte werden erwarten. Daher muss die Tests Toleranz integrieren Informationen über wie viel Fehler erlaubt ist, in der Rückkehr aus f. Beachten Sie, dass die Toleranz, die Informationen über die Funktion abhängen könnte f, sowie den genauen Wert der Eingabe, x.

Mit diesen Zutaten ist die Genauigkeit der Implementierung unserer Funktion als annehmbar (das heißt, es passiert unser Test) Wenn

| ycomputed* - ytrue | < Tol (f; X),*

wo die Toleranz richtet sich sowohl auf den Eingabewert X und das Verhalten der Funktion f selbst.

In Worten sagt diese Gleichung, dass die Funktion der Test war erfolgreich, wenn der zurückgegebene Wert von dem Wert "true" um einen Betrag von weniger als die Tests Toleranz (die zulässige Fehler) unterscheidet. Beachten Sie, dass | ycomputed* - y*true | ist der absolute Fehler der berechneten Funktion.

In diesem Formalismus ein Funktionstest erfolgt durch eine große Anzahl von input-Werte liegen in der Eingabe Domäne der Funktion, die diese Werte durch die Funktion unter Test erstellen und vergleichen die Funktion gibt ygegen die best-rounded (mathematisch wahren) Werte berechnet ywahr. Die Werte der Eingänge sollte gewählt werden, um alle relevanten Teile der Funktion gültige Eingabe Domäne zu decken.

Zu diesem Zeitpunkt hat der Tester zwei Fragen beantworten: Was ist die "wahre" Ergebnis einer Funktion? und was ist eine angemessene Toleranz?

Um die erste Frage zu beantworten, ist die einfachste Sache zu tun, mit eine "unendlichen Präzision" Math-Paket die Eingabe/Ausgabe-Paare zum Testen erstellen. Dieses Paket verwenden nicht 32 oder 64-Bit-Gleitkommazahlen, um einen Wert zu berechnen. Vielmehr nutzt es eine numerische Darstellung — oder besser noch, eine symbolische Repräsentation — eine Zahl, die eine beliebig hohe Anzahl von Ziffern durch die Berechnung auf Kosten der computational Geschwindigkeit berechnen durchführen können. Mehrere handelsübliche Mathematik Pakete implementieren unendliche Präzisionsberechnungen. Darüber hinaus können gemeinsame Sprachen viele unendliche Genauigkeit mathematischen Bibliotheken aufgesteckt werden. Die Möglichkeit, unendliche Präzisionsberechnungen mit modernen Geschwindigkeiten zu verwenden ist die neuesten Innovationen, was diese Art von Tests bequem. Eine dieser Ressourcen ist ausreichend, um die sogenannte "goldene" Wertpaare für Testzwecke eine Gleitkommazahl Funktionsimplementierung erstellen.

Setzen sie zusammen — immer die Tests Toleranz

Nachdem wir golden-Werte haben, müssen wir die andere Frage zu beantworten: Was ist eine angemessene Prüfung Toleranz? Immer die richtige Tests Toleranz ist die kritische Komponente zu testen. Wenn die Toleranz unrealistisch klein ist, wird die Funktion nie seine Prüfung bestehen, auch wenn der beste Algorithmus verwendet wird, um es zu berechnen. Andererseits, wenn die Tests Toleranz zu groß ist, bedeutet dies, dass der zulässige Fehler größer, als es sein muss, und die Funktion wird den Test bestehen, ist auch wenn der Algorithmus fehlerhaft ist.

Die Konditionszahl zuvor definierten ist der Schlüssel zur Bestimmung des akzeptablen Fehlers in Funktion Testen erlaubt. Der Ausdruck für die Konditionszahl kann neu angeordnet werden, um zu lesen:

Equation 2
Gleichung 2

Wir werde bezeichnen dies später als Gleichung 2. Wenn wir identifizieren ∆x als der Abstand zwischen einer Gleitkommazahl und dem nächsten, dieser Ausdruck sagt uns wie viel die Ausgabe des f springt, wie wir aus einer Gleitkommazahl bewegen x zu ihrem Nachbar, X + ∆x. Traditionell nimmt Bereich der Computer-Numerik für ∆x die Funktion eps(x), den Abstand zwischen jeder zwei angrenzenden Gleitkommazahlen. Beachten Sie, dass, da die Rasterweite konstanter ist (siehe Abbildung 1), eps(x) ist eine Funktion der x. (Wie bereits erwähnt, der Abstand zwischen einer Gleitkommazahl und sein nächster Nachbar ist auch verwandt mit ein ULP — das Ausmaß durch das niederwertigste Bit dargestellt.)

Als nächstes fordern wir, dass die Ausgabe-Fehler in unserem Test yberechnet -ytrue, werden weniger als einige Vielfache von dieser Sprung. Das heißt, wir bitten, wo C ist eine Konstante:

Intuitiv, fängt dieser Ausdruck die folgende Idee: Wenn x macht einen Schritt auf die Gleitkommazahlen Raster, die Änderung in der Ausgabe sollte nicht größer als Gleichung 2. Eine fehlerfreie Funktion f wird seine Ausgabe ändern, indem nur die Menge von die Konditionszahl abgeleitet, und nicht mehr. Daher Ausgang Perturbationen, die während der Berechnung der f sollte kleiner sein als die Änderung verursacht durch einen Schritt mit doppelter Startplatz. Die Konstante C ist ein "Fudge-Faktor". Offenbar, als C erhöht, erhöht sich die zulässige Toleranz mit es. Wir können daher diese Konstante als den erlaubten funktionalen Fehler über das theoretische Minimum interpretieren. Bei der realen Prüfung, C nimmt ganzzahlige Werte zwischen 1 und 10, die wir als den zulässigen Fehler, ausgedrückt in ULPs zu interpretieren.

Anwendung der Definition Konditionszahl, können wir schließlich die Gleichung so umstellen, die die Tests Toleranz verfügbar macht:

| yberechnete -ywahren | ≤ C | f'(x) | eps(x) = Toleranz

Dies ist unsere gewünschte Test — es ist der Ausdruck, der durch eine genaue Implementierung der Funktion erfüllt werden muss f für Eingaben x. Mit anderen Worten, ist dies der Ausdruck verwendet, um skalare mathematischen Funktionen zu überprüfen. Beachten Sie, dass dieser Ausdruck für alle gültige Eingabewerte zutreffen sollte x.

Ist die letzte Frage geklärt werden, "Was ist der korrekte Wert der C in der Prüfung verwenden?" Da wir interpretieren C als die Anzahl der ULP Fehler erlaubt, C ist eine ganze Zahl der Ordnung 1. Wir setzen C beginnend mit einer ersten C Wert (in der Regel 10) und die Ausführung des Tests. Wenn der Test bestanden, verringern C durch 1 und führen Sie den Test erneut. Wiederholen Sie diesen Vorgang für abnehmende C Werte, bis der Test fehlschlägt. Wählen Sie dann den Wert des C zuletzt erlaubt, dass den Test zu übergeben (aber immer ein Mensch in der Schleife Vernünftigkeit versichern). Ziel dieses Prozesses ist es, die Tür zu übergeben (wobei weiterhin die Funktion der Prüfung) so weit wie möglich zu schließen, damit Sie sicher sein können, die Funktion ist so konsequent wie möglich getestet. Gut erzogene Funktionen erfordern in der Regel C Werte zwischen 1 und 3, aber kompliziertere Funktionen erfordern möglicherweise größere C Werte für die Übergabe. Wir finden, dass nur sehr wenige Funktion Implementierungen erfordern C > 10 übergeben, und wenn wir eine Funktion, die erfordert C > 10, signalisiert sie oft eine suboptimale Implementierung.

Aus der Sicht des Software-Tests, einmal C wird bestimmt für einen Funktionstest (und die Test-Bahnen), wir wissen, dass alle nachfolgenden Test-Fehler bedeutet, dass etwas in der Funktion Implementierung geändert wurde – wahrscheinlich zum schlechteren (z. B. eine Regression ist aufgetreten). Natürlich Kompromisse Algorithmentechnik können vorschreiben, dass es lohnt es sich locker auf geben C wenn die Regression klein (z. B. eine Geschwindigkeit gegenüber Genauigkeit Trade-off). Ebenso nach einen Algorithmus zu verbessern, es lohnt zu sehen, ob C können weiter verschärft werden. Auf jeden Fall wird ein Job von Software-Tests, der Rest der Software entwickelt wird und die Leitung der Prüfungen Toleranzen.

Golden testen und darüber hinaus

In den Testverfahren, die, den wir bisher besprochen habe, haben wir die vorausberechnete ein-/Ausgabe-Paaren, die die gesamte Eingabe Domäne der Funktion unter Test verstreut verwendet. Wir nennen diese Art von Tests, Testen von golden, was bedeutet, dass die unendliche Genauigkeit Test Oracle golden ein-/Ausgabe-Paare bereitstellt, die als bekannt sind hochgenaue. Die Paare können in einer Datei gespeichert und in das Testprogramm zu lesen, wenn es ausgeführt wird. Als Blackbox-Methode testen funktionale Genauigkeit funktioniert dieser Ansatz ganz gut. Andere Arten von Funktionstests bieten jedoch auch wichtige Möglichkeiten, um die Funktion Verhalten zu überprüfen. Andere Tests umfassen Folgendes:

  • Spezieller Wert zu testen: Viele Funktionen zurückgeben bekannte, genaue theoretische Werte für bestimmte Eingaben, wie z. B. cos(0) = > 1, sin(π) => 0 und gamma(1/2) = √π, Beispiele. In einem speziellen Wert-Test bekannten festen Eingänge werden die Funktion unter Test zugeführt und Funktion ist im Vergleich zu dem bekannten Ergebnis. Natürlich, da irrationale Zahlen wie π genau Gleitkomma Startplatz liegen nicht, die am nächsten mit doppelter Angleichung an diesen Zahlen muss in Tests und einen NULL-Wert verwendet werden, für Sinus und testen Toleranz (wie früher berechnet) wird verwendet, um die computational Ergebnisse überprüfen.
  • Identität zu testen: Viele Funktionen gehorchen Identitäten, die über einen bekannten Domain für alle Eingänge wahr sind. Z. B. sin (X) ^ 2 + cos (X) ^ 2 == 1 für alle Eingänge x. Ein anderes ist arcsin(x) == -i melden (ich * X + Sqrt (1-x 2)). Der Unterschied zwischen einem Identitätstest und ein spezieller Wert-Test ist, dass die Identitätstest für beliebige Eingabe gilt während der Spezialwert-Test nur für einen bestimmten Eingabewert gilt. Infolgedessen überprüfen die Identität Prüfungen die Beziehungen zwischen den Funktionen.

Sie müssen vorsichtig mit Identität Tests sein. Für eine Sache, sind einige Identitäten schlecht konditioniert. Beispielsweise können Zwischenergebnisse anwachsen, ziemlich groß sein, obwohl das Endergebnis mäßig angepasst wird. In diesem Fall können kleine, zulässige entstandenen Zwischenschritte in die Berechnung unechten Testfehler Fehlern. Auch, viele Funktionen (z.B. die inversen trigonometrischen Funktionen) sind mehrwertige in der komplexen Zahlenebene. Blind mit Identität Tests kann unecht Testfehler führen, wenn die rechten und linken Seiten der Identität richtigen Werte liegen auf verschiedenen Riemann-Blättern in der komplexen Ebene zurückkehren. Der Tester muss sorgfältig Identität Tests durch, um diese beiden Probleme vermeiden Handwerk.

  • Inverse zu testen: Dies beinhaltet die Datenverarbeitung ist eine Funktion mit ihrer Inverse und überprüfen das Ergebnis dasselbe wie die Eingabe auf die Probe. Zum Beispiel für Positive x testen wir log(exp(x)) = X. Man könnte meinen, dies als ein Sonderfall der Identität zu testen, und in der Tat es ist. Jedoch weil so viele Funktionen inversen haben — und mathematische Konsistenz fordert, dass eine Funktion mit inverse wieder die ursprüngliche Eingabe geschrieben — verwenden wir eine unterschiedliche Test-Kategorie zu validieren, die Funktionen und ihre inversen auf konsistente Weise zu Verhalten. Die gleichen Vorbehalte, die auch für Identität Tests (wie Klimaanlage oder Renditen liegen auf verschiedenen Riemann Blättern) gelten gelten für inverse testen.
  • Serie Summierung testen: Fast alle transzendente Funktionen gebe eine Reihenentwicklung über einige Eingabe Domäne. In Serie Summierung testen vergleichen wir den Wert von der Funktion unter Test von einem explizit summierte Serie im Test zurückgegebenen Wert zurückgegeben. Sie könnten Serie Summierung als eine Art Identitätstest betrachten. Die Überlegungen gehen in einen gute Serie Summierung Test erstellen sind jedoch ähnlich über Funktionen (z. B. Stabilität und Konvergenz-Kriterien). Daher betrachten wir diese Art der Prüfung konzeptionell anders als Identität zu testen.
  • Kettenbruch-Erweiterungen: Einige Funktionen können auch über einen bekannten Domain mit eine Kettenbruch Expansion ausgewertet werden. Wenn eine solche Erweiterung vorhanden ist, könnte es viel schneller als eine Serie Summe konvergieren. Daher könnte für bestimmte Funktionen der Serie Summierung Test mit einer Ausdehnung von Kettenbruch ersetzt werden.
  • Rechnerisch ermittelten Wert testen (auch bekannt als modellbasiertes testen): Rechnerisch ermittelten Wert zu testen, erstellen Sie eine einfache, nachweislich korrekte Implementierung der Funktion innerhalb der Test selbst. Diese Art von Test gilt nicht unbedingt für skalare mathematische Funktionen. Eine gute Mathe-Paket ist jedoch nicht beschränkt auf die analytische Funktionen. Betrachten Sie beispielsweise Funktionen wie Boden, Decke, mod, Verkettungsoperatoren für Vektoren und so weiter. Jede dieser Funktionen kann geprüft werden, durch das Schreiben von Code, die Konstrukte der grundlegende Computer-Funktion implementiert. Sichern beispielsweise Boden, Decke und die verschiedenen numerischen Chop, die Funktionen mit Umwandlungsoperatoren, die die Gleitkommawert in eine ganze Zahl konvertieren und konvertieren das Ergebnis modelliert werden können in einem Float (mit einige einfache mathematische durchgeführt, um das genaue Verhalten der Funktion unter Berücksichtigung zu imitieren). Ein Vorteil dieser Art von Test ist, dass die Umsetzung in der Regel trivial ist und daher durch Inspektion nachprüfbar.
  • Fehler zu testen: Diese Tests sicherstellen, dass ungültige Eingabe ordnungsgemäß behandelt wird, durch Rücksendung einen Fehler beim Säubern, mit dem Programmierer sein, um das Problem schnell und klar zu verstehen zu können. Z. B. bei der Arbeit im reellen Zahlen Wurzel(x) sollte einen nützlichen Fehler zurück (oder NaN) Wenn x < 0. Einige Eingabefehler sind bekannt, dass den Computer stürzt ab, wenn sie sind nicht ordnungsgemäß behandelt, und der Tester Aufgabe besteht darin, sicherzustellen, dass dies nicht auftritt.

Der Vorteil dieser Typen von Tests ist, dass sie eine Gegenprüfung der Funktion Korrektheit mit nur Mathematik selbst liefern. Da diese Methoden als Grundlage der Prüfung die selbst-Konsistenz der Mathematik verwenden, sie sind "bekannten guten" und nicht ausschließlich durch numerische Berechnungen mit Software von Drittanbietern.

Der Ansatz

Eine Möglichkeit, den Vorteil der Bedingung Anzahl Toleranzen zu schätzen ist, die Toleranzen zum Validieren von skalaren mathematische Funktionen, die Singularitäten in ihre Eingabe Domains zu prüfen. Beispielsweise sind die gemeinsamen trigonometrischen Funktionen tan und Gitterbett singulär am eine unendliche Anzahl von Punkten entlang der Linie reelle Zahl. Wenn feste, Konstante Toleranzen für die Genauigkeit Validierung verwendet wurden, diese Funktionen würden ihre Tests für input-Werte in der Nähe von Singularitäten scheitern oder die testen Toleranzen unbedingt wäre so groß, dass die Tests nicht wirksam sein. Mit Bedingung Anzahl Toleranzen können wir die Skalarfunktionen innerhalb einer kleinen Handvoll ULPs über die gesamte Eingabe Domäne der Funktion zu überprüfen. Siehe Abbildung 2 sind Beispiele der Übergabe ULP-Werte, die wir, in der Qualifikation der Funktionen in der Microsoft Cloud Numerik-Produkt vertrieben gefunden haben. Das heißt, sind die ULP-Werte, bei denen die entsprechende Funktion seiner Test erfolgreich.

Abbildung 2 ULP-Werte übergeben

Function Eingabe Domäne Übergabe ULP Kommentieren
Atan2 Reelle Zahlen 1 Zwei Eingang, vier Quadranten arctan
Kinderbett Reelle Zahlen 3  
Coth Komplexe Zahlen 3  
Cuberoot Reelle Zahlen 2  
Ellipe Reelle Zahlen x so, dass 0 ≤ x ≤ 1 4 Elliptische Integrale E
Ellipk Reelle Zahlen x so, dass 0 ≤ x ≤ 1 6 Elliptische Integrale K
Expm1 Reelle Zahlen 3 Exp(x) - 1
Gamma Reelle Zahlen 3  
Log Reelle Zahlen 3  
Log Komplexe Zahlen 3  
Log1p Reelle Zahlen 1 Log(1+x)
Log1p Komplexe Zahlen 1 Log(1+x)
PSI Reelle Zahlen 6 Psi-Funktion — Derivative der Gammafunktion
Sqrt Reelle Zahlen 0 IEEE-Spezifikation erfordert dies "am besten gerundet werden"
Tan Reelle Zahlen 1  
Tanh Reelle Zahlen 4  
Tanh Komplexe Zahlen 4  

Die Schlussfolgerung aus den Beispielen in sein Abbildung 2 ist, dass die Spezialfunktionen mit Algorithmen, die Genauigkeit von einer kleinen Anzahl von ULPs sind implementiert sind. Im schlimmsten Fall dargestellt, in Abbildung 2 haben einen Fehler weniger als 6 ULPs, das entspricht log10(2^6) = 1.8 Dezimalstellen des Fehlers in der niedrigsten Ordnung-Ziffern der Nummer. Für Gleitkommatypen Double, dies entspricht einem relativen Fehler von 1.3323e-015.

Zustand-von-der-Art testen

Um zu überprüfen, wurde eine strenge Testverfahren zur Validierung der Algorithmen verwendet, die in die Microsoft Cloud Numerik Math Pakete erfolgreich angewandt. Mithilfe von Tests Toleranzen, abgeleitet von der Funktion Konditionszahl hat es uns ermöglicht zu identifizieren und korrekt unzulässige Funktion Implementierungen, auch wenn der Fehler erst in den letzten paar Ziffern der Funktion gibt. Feste testen Toleranzen können keinen strengen Test bereitstellen, der auch nicht vermeidbare Fehler (z. B. nahe Funktion Singularitäten) führt. Die meisten unserer Tests beteiligt mit goldenen Wert Eingabe/Ausgabe-Werte, die mit unendlicher Genauigkeit Math Pakete vorausberechnet werden und dann in Dateien, die beim Test gelesen werden gespeichert. Neben der Verwendung von golden Werte, führten wir auch Gegenkontrollen auf unsere Funktion-Implementierungen, die mit einer Vielzahl von verschiedenen Math Identitäten um das Verhalten unserer Funktionen zu überprüfen.

Wir glauben, Benutzer von Microsoft Cloud Numerik können seine Vielzahl von Mathematik und Statistik-Bibliotheksfunktionen und zuversichtlich, dass die Funktionen mit der modernsten Software Testmethoden gründlich geprüft worden sein.

Weitere Informationen empfehlen wir Ihnen, lesen David Goldberg klassische Beschreibung der Gleitkommaoperationen, "Was Every Computer Wissenschaftler sollten wissen über Floating-Point Arithmetic," der unter bit.ly/vBhP9m und anderen Seiten.

Stuart Brorson ist ein SDET im Microsoft-NERD-Center in Cambridge, Mass. Microsoft, wenn das Unternehmen interaktive Supercomputing, die entwickelte Software ermöglicht Benutzern erworben, mathematische auszuführen und Matrix-Berechnungen trat er am parallelen Supercomputern. Für Spaß genießt Brorson hacking Elektronik und irischen Geige um Boston zu spielen.

Ben Moskowitz ist ein SDET Prüfung Mathematik-basierten Projekten bei Microsoft spezialisiert. Er trug zu den Veröffentlichungen von Cloud Numerik und Solver Foundation, ein Optimierungspaket und Plattform, die den Visual Studio-Leuchtturm-Award 2011 gewonnen. Arbeitszeiten, er verbringt Zeit mit seiner Frau, Pflege für ihre Stadt-Wohnung-Ziegen.

Alan Edelman ist Professor für Mathematik und Mitglied der Informatik und AI Laboratorien am MIT in Cambridge, Mass. Professor Edelman gewann zahlreiche Preise für seine Arbeiten über numerische Analysis, parallel-computing und zufällige Matrix Theorie. Er war der Gründer der interaktiven Supercomputing, ist einer der Gründer des Projektes Julia, hat viel gelernt von Velvel Kahan und beteiligt sich stark in der numerischen Mathematik-Konsortium zu Fragen von Gleitkommazahlen Mathematik*.***

Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Paul Ringseth