Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.06.2008, 18:23

Nur genau Null zulassen

Hi;

Follgende Bediengung soll nur ausgeführt werden wenn m_FX ganz genau Null ist:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool CNULLCalculate :: Fcalculate (float x)
{
    m_fN = x;
    m_Fx = x*x*x; //Hier Funktion eintragen


    if (m_Fx == NULL)
    {
        
        return  true;

    }
    else
    {
        return  false;
    }

}


Sie wird allerdings auch ausgeführt wenn m_Fx z.b irgend einen Wert zwischen 0.999.. und -0,999.. hat.

Jetzt ist die große Frage wie man das vermeiden kann..

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

19.06.2008, 18:37

Nun, es ist schwierig floats genau zu vergleichen. Bei Berechnungen mit floats schleichen sich sehr schnell Genauigkeitsfehler ein, daher macht man float vergleiche in der Regel immer mit einer gewissen Toleranz.
also z.B. x < 0.001f && x > -0.001f.

Und NULL sollte eigentlich nur für Pointer genutzt werden.

Und dein Fehler wird denke ich mal folgender sein:
NULL ist (meistens) als (void*)0 definiert, also ein ganzzahliger Typ.
Was macht C++, er wird dir dein m_Fx implizit in einen Integer casten, und da wird numal alles was <1 ist zu 0.

Also ein Vergleich mit 0.0f würde dein Problem lösen.

3

19.06.2008, 19:10

NULL ist zumindest als 0 definiert.

C-/C++-Quelltext

1
2
3
4
5
const bool NULLCalculate::Fcalculate(const float x)
{
    m_fN = x;
    return (m_Fx = x * x * x) == 0.0f;
}
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

19.06.2008, 23:45

C-/C++-Quelltext

1
2
3
4
5
const bool NULLCalculate::Fcalculate(const float x)
{
    m_fN = x;
    return fabsf( (m_Fx = x * x * x) ) < FLT_EPSILON;
}
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

19.06.2008, 23:50

@David

Es geht diesmal doch genau nicht darum, minimale Abweichungen zu tollerieren ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

19.06.2008, 23:53

Zitat von »"grek40"«

@David

Es geht diesmal doch genau nicht darum, minimale Abweichungen zu tollerieren ;)


Oh, hu! :) Überlesen! 8)
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

20.06.2008, 11:56

Zitat von »"xardias"«

Und dein Fehler wird denke ich mal folgender sein:
NULL ist (meistens) als (void*)0 definiert, also ein ganzzahliger Typ.
Was macht C++, er wird dir dein m_Fx implizit in einen Integer casten, und da wird numal alles was <1 ist zu 0.

Also ein Vergleich mit 0.0f würde dein Problem lösen.


Ich denke du hast recht was das Problem anbelangt. Allerdings tritt es vermutlich schon weiter oben auf: Der Compiler darf (zumindest wenn er Standardkonform sein will) bei dem Vergleich im if m_Fx nicht in einen int casten, wenn m_Fx ein Gleitkommatyp ist, sondern müsste den Nullpointer (Nullpointerkonstanten sind von integralem Typ) in einen entsprechenden Gleitkommatyp umwandeln.

Die Frage ist: Von welchem Typ ist m_Fx. Ich denk mal dass m_Fx ein int ist. Dann werden schon bei der Zuweisung an m_Fx "die Kommastellen abgeschnitten".

Lösung: Mach aus m_Fx einen float. Dann musst du natürlich die, von den anderen bereits angesprochenen, Probleme beim Vergleich zweier Gleitkommazahlen berücksichtigen...

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

8

20.06.2008, 18:49

sorry, hast recht. Kleine links-rechts-schwäche *hust* ;)

Werbeanzeige