Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectX 9 - (Verständnis-)Problem mit Pi (https://www.delphipraxis.net/69143-directx-9-verstaendnis-problem-mit-pi.html)

Puhbaehr 10. Mai 2006 20:49


DirectX 9 - (Verständnis-)Problem mit Pi
 
Servus!

Als ich eben einen Kreis berechnen wollte nutzte ich D3DX_PI aus der d3dx9.pas.

D3DX_PI ist dort in der Unit als Konstante deklariert:

Delphi-Quellcode:
const
  D3DX_PI   : Single = 3.141592654;
Laut Definition ist das in etwa korrekt.
(π ≈ 3,141 592 653 589 793 238 462 643 383 279 ...)

Ich wollte nun mit D3DX_PI Koordinaten eines Kreis berechnen und bemerkte beim Debuggen Ungenauigkeiten in den Ergebnissen.

Beim näheren Hinsehen und draufhalten der Maus auf D3DX_PI zeigte Delphi D3DX_PI = 3.141592741. Lasse ich mir PI in einem Meldungsfenster ausgeben so wird sogar D3DX_PI = 3.14159274101257 ausgegeben.

Ähm...ist das nun ein Fehler der CPU oder ein Denkfehler? :gruebel: :gruebel: :gruebel:

Die d3dx9.pas habe ich von der Seite von http://www.martinpyka.de/

Ich wäre für Aufklärung dankbar!

Gruß, Robert

Flare 10. Mai 2006 20:53

Re: DirectX 9 - (Verständnis-)Problem mit Pi
 
Ich würde es nicht Fehler nennen, da Single sowieso nur mit den ersten 8 Nachkommatsellen rechnet, wo der Rest herkommt weiß ich jedoch nicht...


Flare

Khabarakh 10. Mai 2006 21:01

Re: DirectX 9 - (Verständnis-)Problem mit Pi
 
Sagen wirs so:
Nehmen wir an, dass du mit dem "falschen" Pi einen Kreis zeichnen würdest. Damit am Ende des Kreises eine Abweichung von 1 mm entstünde, müsste der Kreis einen Radius von 5,7 km haben (Rechenfehler meinerseits nicht ausgeschlossen ;) ).

@Flare: Ist ein Rundungsfehler kein Fehler ;) ?

Flare 10. Mai 2006 21:04

Re: DirectX 9 - (Verständnis-)Problem mit Pi
 
Zitat:

Zitat von Khabarakh
@Flare: Ist ein Rundungsfehler kein Fehler ;) ?

Es ist schon ein Fehler, aber ein "beabsichtigter", man hätte ja auch Double für Pi benutzen können, aber man brauch es nicht. Also ist es ein Fehler den man verkraftet, kennt, duldet, usw. In meinen Augen ist es kein Fehler mehr :zwinker:


Flare

Puhbaehr 10. Mai 2006 21:17

Re: DirectX 9 - (Verständnis-)Problem mit Pi
 
Zitat:

Zitat von Khabarakh
Sagen wirs so:
Nehmen wir an, dass du mit dem "falschen" Pi einen Kreis zeichnen würdest. Damit am Ende des Kreises eine Abweichung von 1 mm entstünde, müsste der Kreis einen Radius von 5,7 km haben (Rechenfehler meinerseits nicht ausgeschlossen ;) ).

Du meinst wäre Pi ungenau würde es selbst bei einem größeren Kreis nicht auffallen. Ich hab die Definitionsseite bis fast zum Ende gelesen. Das weiß ich, dass das keine Rolle spielt :)

Nur, mich irretiert, dass D3DX_PI ein anderer Wert zugewiesen wird als er hinterher ausgibt. Dabei handelt es sich scheinbar nicht um einen Rundungsfehler.
Wie kann es denn sein, dass eine Konstante irgendwann einen anderen Wert besitzt als ihr zugewiesen wurde?
Das ist das was ich nicht verstehe.

jfheins 10. Mai 2006 22:11

Re: DirectX 9 - (Verständnis-)Problem mit Pi
 
Fließkommazahlen sind ungenu. Da du im zehnersystem rechnest und der computer im binärsystem, kann es passiern, dass der wert nur nährungsweise in der variable steht und nicht genau. so könnte z.B 1,3 als 1,299999991324 gespeichert sein, weil er 1,3 im binärsystem nicht korrekt darstellen kann ;)

Puhbaehr 11. Mai 2006 12:16

Re: DirectX 9 - (Verständnis-)Problem mit Pi
 
Mmh... verstehe... habe gestern auch bei einem Test gemerkt, dass es an den Fließkommazahlen liegt.

In der Delphi-Hilfe steht, dass der Typ Single 7-8 Stellen aufnehmen kann.
Die Zahl Pi beinhaltet aber 10 Stellen.
Nehme ich für D3DX_PI den Typ Double (dieser kann 15-16 Stellen aufnehmen) wird Pi korrekt dargestellt.
Allerdings bringt mir das nicht viel, denn rechne ich sowie die Units von DirectX anschließend mit Single weiter so wird das Ergebnis wieder nicht korrekt.

Bei einem Kreis, selbst wenn er größer ist, spielt es keine Rolle ob 7 oder 8 Stellen nach dem Komma ungenau sind.
Aber ob es auch keine Rolle spielt wenn ich eine Karte mit (X, Y) = 1000 x 1000 Punkten habe und sich dabei bei jedem Pixel der Wert um 0,000000087 vergrößert... ok, das wären es selbst bei 1000 Punkten nur eine Verschiebung um 0,000087 Punkten. Also werde ich das so hinnehmen.

Vielen Dank für die Hilfe!

Gruß, Robert


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 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