AGB  ·  Datenschutz  ·  Impressum  







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

tan() von Single, Double, etc.

Ein Thema von Rollo62 · begonnen am 20. Nov 2017 · letzter Beitrag vom 22. Nov 2017
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#1

AW: tan() von Single, Double, etc.

  Alt 21. Nov 2017, 09:53
Hier eine vereinfachte Implementation meiner DAMath-Funktion komplett mit Test-Programm
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.240 Beiträge
 
Delphi 12 Athens
 
#2

AW: tan() von Single, Double, etc.

  Alt 21. Nov 2017, 10:33
Dankesehr für die interessanten Ansätze.
Also liege ich mit meinem Ansatz NaN o.ä. nicht ganz falsch.
Das muss man aber wohl immer je nach Aufgabe abwägen, für mal schnell hier und da tan() benutzen ist das OK für mich.

@gammatester
DAMath und ähnliche werde ich mir mal in einer ruhigen Minute genauer ansehen, da steckt ja eine ganze Menge Gehirnschmalz drin.
Tolle Libraries

Was mich da einbischen wundert ist das du direkt auf 0.0 vergleichst, z.B.
  if x=0.0 then begin Ich versuche so etwas eigentlich immer das mit Epsilon abzufangen, speziell dann wenn die Eingaben aus anderen Rechen-Ergebnissen kommen.
Wann ist das Epsilon nötig, und wann nicht ?
Vielleicht bin ich wieder zu übervorsichtig und kann etwas einsparen

P.S.: Noch eine kleine Frage an die Zahlentheoretiker hier:
Ist denn +Infinity richtig gewählt, die tan Funktion kann doch springen ?
Läuft die Näherung von links und rechts denn immer auf +Infinity raus ) ?


Rollo
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: tan() von Single, Double, etc.

  Alt 21. Nov 2017, 10:59
P.S.: Noch eine kleine Frage an die Zahlentheoretiker hier:
Ist denn +Infinity richtig gewählt, die tan Funktion kann doch springen ?
Läuft die Näherung von links und rechts denn immer auf +Infinity raus ) ?
Wie ist denn der Tangens = tan(x) definiert?
In der Regel sagt man sin(x) / cos(x)!
Bei 90° haben wir sin(90°) / cos(90°) = 1 / 0.
Irgendetwas durch irgendetwas unendlich kleines ist halt abnormal übergroß bzw. unendlich.
Ob unendlich positiv oder negativ hängt von den Vorzeichen von Nenner und Zähler ab.
Vereinfacht: Positiv unendlich bei 90° und minus unendlich bei 270° (da 1 / 0 und -1 / 0).
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: tan() von Single, Double, etc.

  Alt 21. Nov 2017, 11:23
Eine sehr interessante Diskussion hier.
Habe gerade mal geschaut wie das bei uns gelöst ist.
Mal davon abgesehen das wir Winkelfunktionen so weit es geht vermeiden..

Wir haben einen Static Record Tdeg die bei uns für Ermittlung der Tan, etc zuständig ist.

Spasseshalber habe ich mal den Test erweitert

Tand: Gammatester
Tdeg: unsere Routine
Tan aus der system.math

Ergebnisse:
Code:
Tand :   0       0.0000000000000000
Tdeg :   0       0.0000000000000000
Tan :   0       0.0000000000000000

Tand :  15       0.2679491924311228
Tdeg :  15       0.2679491924311228
Tan :  15       0.2679491937160492

Tand :  30       0.5773502691896258
Tdeg :  30       0.5773502691896258
Tan :  30       0.5773502588272095

Tand :  45       1.0000000000000000
Tdeg :  45       1.0000000000000000
Tan :  45       1.0000000000000000

Tand :  60       1.7320508075688770
Tdeg :  60       1.7320508075688779
Tan :  60       1.7320508956909180

Tand :  75       3.7320508075688768
Tdeg :  75       3.7320508075688776
Tan :  75       3.7320504188537598

Tand :  90                     +Inf
Tdeg :  90                     +Inf
Tan :  90-22877332.0000000000000000

Tand : 105      -3.7320508075688768
Tdeg : 105      -3.7320508075688763
Tan : 105      -3.7320508956909180

Tand : 120      -1.7320508075688770
Tdeg : 120      -1.7320508075688763
Tan : 120      -1.7320505380630493

Tand : 135      -1.0000000000000000
Tdeg : 135      -1.0000000000000000
Tan : 135      -1.0000000000000000

Tand : 150      -0.5773502691896258
Tdeg : 150      -0.5773502691896256
Tan : 150      -0.5773503184318542

Tand : 165      -0.2679491924311228
Tdeg : 165      -0.2679491924311225
Tan : 165      -0.2679493129253387

Tand : 180       0.0000000000000000
Tdeg : 180       0.0000000000000000
Tan : 180       0.0000000874227766

Tand : 195       0.2679491924311228
Tdeg : 195       0.2679491924311228
Tan : 195       0.2679492235183716

Tand : 210       0.5773502691896258
Tdeg : 210       0.5773502691896260
Tan : 210       0.5773502588272095

Tand : 225       1.0000000000000000
Tdeg : 225       1.0000000000000000
Tan : 225       0.9999998807907104

Tand : 240       1.7320508075688770
Tdeg : 240       1.7320508075688790
Tan : 240       1.7320512533187866

Tand : 255       3.7320508075688768
Tdeg : 255       3.7320508075688794
Tan : 255       3.7320518493652344

Tand : 270                     +Inf
Tdeg : 270                     +Inf
Tan : 270-83858280.0000000000000000

Tand : 285      -3.7320508075688768
Tdeg : 285      -3.7320508075688719
Tan : 285      -3.7320513725280762

Tand : 300      -1.7320508075688770
Tdeg : 300      -1.7320508075688768
Tan : 300      -1.7320511341094971

Tand : 315      -1.0000000000000000
Tdeg : 315       1.0000000000000000
Tan : 315      -1.0000002384185791

Tand : 330      -0.5773502691896258
Tdeg : 330      -0.5773502691896253
Tan : 330      -0.5773505568504334

Tand : 345      -0.2679491924311228
Tdeg : 345      -0.2679491924311226
Tan : 345      -0.2679489552974701

Tand : 360       0.0000000000000000
Tdeg : 360       0.0000000000000000
Tan : 360       0.0000001748455531
Damit kann ich leben denke ich
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#5

AW: tan() von Single, Double, etc.

  Alt 21. Nov 2017, 12:52
Wie ist denn der Tangens = tan(x) definiert?
In der Regel sagt man sin(x) / cos(x)!
Bei 90° haben wir sin(90°) / cos(90°) = 1 / 0.
Irgendetwas durch irgendetwas unendlich kleines ist halt abnormal übergroß bzw. unendlich.

Das kann man auch in der System.Math so nachlesen (hier nicht relevante Compiler-Direktiven entfernt):
Delphi-Quellcode:
  { The following constants should not be used for comparison, only
    assignments. For comparison please use the IsNan and IsInfinity functions
    provided below. }

  NaN = 0.0 / 0.0;
  Infinity = 1.0 / 0.0;
  NegInfinity = -1.0 / 0.0;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: tan() von Single, Double, etc.

  Alt 21. Nov 2017, 11:16
Was mich da einbischen wundert ist das du direkt auf 0.0 vergleichst, z.B.
  if x=0.0 then begin Ich versuche so etwas eigentlich immer das mit Epsilon abzufangen, speziell dann wenn die Eingaben aus anderen Rechen-Ergebnissen kommen.
Wann ist das Epsilon nötig, und wann nicht ?
Vielleicht bin ich wieder zu übervorsichtig und kann etwas einsparen
MM ist diese epsilon Sache meist falsch bzw unnötig. Für kleine x ist tan(x) ~ x und 0 ist nun mal das einzige Vielfache von 45 nahe 0, also kein Problem.

Zu Epsilon bzw zur Math-Funktion iszero. Ebenson wie tan(x) ~ x gilt zB sinh(x) ~ x und arcsinh(x) ~ x, aber was liefert Delphi: Für Delphi 6 ist wenigsten der sinh-Wert korrekt
Code:
sinh(1e-20) = 1e-20
arcsinh(1e-20) = 0
Ab Delphi 7 siehts dann so aus
Code:
sinh(1e-20) = 0
arcsinh(1e-20) = 0
Ich benutzte diese epsilons, wenn ich zB vergleichen will ob kleine Änderungen vorliegen, d.h. ob x+delta ~ x ist, und dann als Test in der Form if abs(delta)<= epsilon*abs(x) .

Edit: Sinnvoll sind die Epsilons sind auch bei irrationalen Nullstellen von Funktionen, zB eben beim Tangens die Nullstellen pi/2 + n*Pi des Cosinus.

Geändert von gammatester (21. Nov 2017 um 11:24 Uhr)
  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 11:12 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