AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Jcl Unit test: Mathefrage

Ein Thema von TurboMagic · begonnen am 7. Aug 2020 · letzter Beitrag vom 7. Aug 2020
Antwort Antwort
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
721 Beiträge
 
Delphi XE5 Professional
 
#1

AW: Jcl Unit test: Mathefrage

  Alt 7. Aug 2020, 13:44
Hallo,
für dein Beispiel x:= -3.98; sehen meine Ergebnisse wie folgt aus:
AMath.ArcCsc(-3.98) = -0.25397795477090606400
Math.ArcCsc(-3.98) = -0.25397795477090606400
Diff: AMath - Math = -2.71050543121376E-0020 // Fazit: intern sind sie doch unterschiedlich!

Der exakte Wert mittels Multipräzisions-Arithmetik (die ersten 50 Stellen) lautet:

ArcCsc(-3.98) exakt = -0.253977954770906064152801105213402329055852686874

Diff: Exakt - Math = -0.000000000000000000026373915071569760740558348483 8
Diff: Exakt - AMath = 0.000000000000000000000731139240567850109627971537 9

Fazit: AMath. ArcCsc(x) ist um zwei Stellen genauer als Math.ArcCsc(x).

Vergleiche mal das Ergebnis mit JclMath.ArcCsc(X). In welchem Bespiel stimmen die Quadranten nicht?
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
721 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Jcl Unit test: Mathefrage

  Alt 7. Aug 2020, 13:51
Wenn ich meine Zahlen mit Deinen vergleiche, habe ich den Verdacht, daß JclMath.ArcCsc(x) nur mit Double-Zahlen arbeitet, oder wenigstens zeigt CheckEquals(..) nur Double-Ergebnisse an.
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
721 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Jcl Unit test: Mathefrage

  Alt 7. Aug 2020, 14:00
Gerade fällt mir eine wichtige Frage ein: Kompilierst Du für die 32-Bit-Plattform oder für 64-Bit?
Bei 64-Bit gilt LEIDER nämlich
Delphi-Quellcode:
Type
  Extended = Double;
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 ( 7. Aug 2020 um 14:02 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.034 Beiträge
 
Delphi 12 Athens
 
#4

AW: Jcl Unit test: Mathefrage

  Alt 7. Aug 2020, 14:10
Hallo,

danke schon mal für deine Mühen!

Aber:

1. das mit 64 Bit und extended = double ist mir grundsätzlich bewußt.
Das war damals der Deal, sonst gäb's unter 64 Bit keine ASM Unterstützung,
gegen die wurde das eingetauscht

2. Du hast meinen letzten Beitrag zum Thema nicht ganz richtig gelsen.
Du hast wie ich am Anfang auch übersehen, dass die eine Zahl mit - als Vorzeichen
und die andere (die von JCLMath) kein Vorzeichen hat, also positiv ist.
Der Unterschied liegt also nicht in irgendwelcher Nachkommastellen-Präzision!

Schaut man sich den Code von JCLMath und von Math an, sieht man auch, dass da ein
unterschiedliches Rechehverfahren benutzt wird.

Nach deinem Test würde ich aber sagen, dass System.Math recht hat. Oder?
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
721 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Jcl Unit test: Mathefrage

  Alt 7. Aug 2020, 15:49
Hallo TurboMagic,
in der Jedi Code Library wird ArcCsc(X):= ArcSec(X / Sqrt(X * X -1)); verwendet. System.Math benutzt dagegen  ArcCsc(X):= ArcSin(1 / X); , während AMath einen komplexeren Algorithmus unter Verwendung von ArcTan(1/Sqrt(x^2-1))} favorisiert.

Der Vorzeichenfehler rührt von folgendem Sachverhalte her: Die trigonometrischen Funktionen wie Sekans, Kosekans etc. sind periodische Funktionen: d. h. für unendlich viele Argumente x erhalten wir unendlich oft denselben Funktionswert: z.B. für den Kosekans Csc(x) = Csc(x + 2*Pi).

Ihre Umkehrfunktionen ArkusSekans, ArkusKosekans etc. sind jedoch nicht periodisch. Um eine exakte Zuordnung vornehmen zu können, müßten wir die beiden Terme (= diverse Längen am Einheitskreis) aus denen diese Quotienten bestimmt worden sind, vorzeichengerecht kennen. Ansonsten ist eine Umkehrung der Funktion nur auf den Definitionsbereich der umzukehrenden Funktion beschränkt möglich.

Es ist also nicht gleich – um bei Deinem Beispiel zu bleiben – ob x:= -3.98 z.B. so entstanden ist: -3.98/1 = -3.98 oder +3.98/(-1) = = -3.98 etc. Im ersten Fall liegt der 3. Quadrant vor, im zweiten der 4. Quadrant. Je nach dem, über welche Funktion ArcSec(..), ArcSin(..) oder ArcTan(..) die Umkehrfunktion berechnet wird, landen wir mal im 1., mal im 4. Quadranten. Aber ist es kein Problem, schließlich ist z.B. der Arkuskosekans eine sogenannte ungerade Funktion mit der Eigenschaft ArcCsc(+x) = -ArcCsc(-x). Bilde also einfach den Betrag Abs(..) davon, wenn das Minus stört!
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 ( 7. Aug 2020 um 15:57 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.034 Beiträge
 
Delphi 12 Athens
 
#6

AW: Jcl Unit test: Mathefrage

  Alt 7. Aug 2020, 16:53
Danke für die Antwort.
Habe den Test so umgebaut, dass die FUnktionsaufrufe jetzt in abs Aufrufe eingefügt wurden. Dann klappt's natürlich.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz