Autor Beitrag
Nik94
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 14.11.12 23:06 
Hallo zusammen,
Ich habe aktuell das Problem, dass ich den Tangens von 1.57*0,5 in einer Single-Variable speichern muss, es scheint mir hier allerdings zu einem Überlauf zu kommen, da ich als Ergebniss der Tan-Funktion 1 bekomme, was jedoch ~57,... sein sollte. Daher meine Frage: Gibt es eine Tan-Funktion, weclhe speziell Single-Werte zurückgibt?
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mi 14.11.12 23:16 
Hallo,
der Tangens von 1.57*0,5, d.h. rund PI/4, ist genähert 1 und nicht ~57,...
Außerdem kann eine Single-Variable Zahlen bis 10^38 aufnehmen, d.h., hier dürfte es kein Problem sein.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Do 15.11.12 05:41 
Wahrscheinlich meint er den tan(90°) oder tan(pi/2). Der ist nämlich unendlich (= 1/0) und damit in keiner noch so großen Variablen speicherbar. Das einzige, was man da machen kann, ist eine Abfrage:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
// wenn es denn so genau ginge: (s. meine Anmerkung im Text unten)

  function MeinTangens(x : single; var Ueberlauf : boolean) : single;
  var
    temp : single;
  begin
    try
      temp := tan(x);
      Ueberlauf := FALSE;
    except
      temp := 0.0// oder 9.999e37;
      Ueberlauf := TRUE;
    end;
    result := temp;
  end;


Das Gleiche gälte dann für cotangens. Dann musst Du eben zwei Parameter, von denen einer eine echte Variable ist (Ueberlauf), der Funktion übergeben, so dass Du dann die Funktion korrekt abarbeiten kannst, ohne dass sie abstürzt. Allerdings darfst Du dann den Funktionswert nicht verwenden, wenn ein Überlauf erfolgt. Alkternativ übergebe als "Funktionswert" z.B. 9.9999e+37

Allerdings, ich habe mal die ganze Sache getestet. Bei Single als Variablentyp bekomme ich keinen Überlauf, da der Wert zu "ungenau" ist, um diesen zu produzieren. Selbst bei extended bekomme ich keinen Überlauf. Also benötigt man die oben genannte Funktion gar nicht, denn es gäbe nie einen Überlauf, sondern bloß sehr große Werte. Computer sind zwar schnelle Rechner, jedoch eben nicht so genau im Rechnen, wenigstens manchmal.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Do 15.11.12 10:43 
Ich vermute eher, daß eine Vermischung des Winkelmodus vorliegt. Wenn das Ergebnis ungefähr 57 sein soll, wäre eine richtige Umsetzung
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
uses math;
//..
var
  s: single;
begin
  s := RadToDeg(tan(0.5*1.57));
end;
Das Ergebnis wäre dann s=57.250171661.
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Do 15.11.12 13:18 
user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
Das Ergebnis wäre dann s=57.250171661.

Richtig, habe ich nicht gesehen.
Allerdings fällt mir im Moment keine Situation ein, bei der ein Tangenswert in das Winkelmaß verwandelt werden muss. Bei Arkustangens ok, aber bei Tangens? :nixweiss:
Ich werde noch einmal überlegen.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Do 15.11.12 13:59 
Also, einen Tangenswert in ein Winkelmaß umzuwandeln, das macht keinen Sinn. Denn dann müsste ja auch das Gleiche für den Sinus und Cosinus gelten. Und da ist ja bekanntlich der Wertebereich jeweils von -1 bis +1, also in "Winkel" genau diese +/- 57,29... . Tangens, cosinus ... sind ja Seitenverhältnisse im Dreieck und keine Winkel.

Wie der Mathematiker schon schrieb, gilt das für Arcustangens, Arcuscosinus ...., bei der ja die Seitenverhältnisse in einen Winkel umgerechnet werden.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Do 15.11.12 15:06 
Wir haben mal wieder das Problem, daß Fragesteller/in sich ungenau ausdrückt und auf keine Antwort reagiert. Ich weiß, daß RadToDeg(tan()) normalerweise nicht sinnvoll ist. Aber auch der Hinweis mit tan(Pi/2) und Overflow hilft nicht weiter. Denn tan(x) gibt keinen Überlauf für Singlewerte x nahe Pi/2. Für x=single(Pi/2) und den nächst kleineren Wert hat man x=1.57079637 mit tan(x) = -22877332.00, bzw. x=1.57079625 mit tan(x) = 13245402.00.
Nik94 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 15.11.12 15:18 
Sorry, aber ich habe gestern abend vergessen meinen Taschenrechner mit dem ich die Rechnung kontrolliert habe auf RAD zu stellen :autsch: . Das SThema hätte sich damit erledigt. Triotzdem Danke :)
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 15.11.12 19:50 
user profile iconNik94 hat folgendes geschrieben Zum zitierten Posting springen:
Das Thema hätte sich damit erledigt.
Vielleicht noch eine Anmerkung: wenn es nicht auf die rohe Geschwindigkeit oder den Speicherverbrauch bei Millionen von Werten ankommt, gibt es eigentlich keinen guten Grund (mehr?), nicht double zu verwenden.

Denn:
user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
x=1.57079637, [...] x=1.57079625
Das sind grade mal 8 Stellen Genauigkeit, wenn man da ein paar Rechenschritte verkettet handelt man sich schnell brutale Ungenauigkeiten ein.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Do 15.11.12 20:15 
Hallo,
user profile iconNik94 hat folgendes geschrieben Zum zitierten Posting springen:
Das SThema hätte sich damit erledigt. Triotzdem Danke :)

Wieso "trotzdem"? Haben wir etwas falsch gemacht oder Du?
Ein normaler Dank müsste es schon sein, denn hier haben sich einige Gedanken gemacht, um Dir zu helfen. :?!?:

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
... wenn es nicht auf die rohe Geschwindigkeit oder den Speicherverbrauch bei Millionen von Werten ankommt, gibt es eigentlich keinen guten Grund (mehr?), nicht double zu verwenden.

Verstehe ich auch nicht, warum double nicht gehen soll. Das werden wir wohl aber nicht erfahren.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Nik94 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 15.11.12 21:43 
1. Der einzige Grund dafür, dass ich hier Single verwende, liegt darinn, dass eine von meinen eingebundenen Bibliotheken(DirectX) mit Single's arbeitet und ich in eine Cast von 6 oder 8-Bit auf 4-Bit nur unnötige Zeitverschwendung und die entstehung von unnötigen ungenauigkeiten sehe.
2. Ja, ich habe etwas falsch gemacht :D allerdings liegt der Fehler ja nicht bei euch, also danke :)