Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   floats auf Null prüfen (C++) (https://www.delphipraxis.net/111470-floats-auf-null-pruefen-c.html)

SnuffMaster23 3. Apr 2008 23:54


floats auf Null prüfen (C++)
 
Ich denke mal das ist ein eher verbreitetes Problem, eine Gleitkommazahl auf Null zu prüfen. Allerdings gibt es ja nicht >die< Null wie bei Integers also gestaltet sich das etwas schwieriger.
Mit x == 0.0 gehts jedenfalls nicht, und die Null als doch recht kleines Intervall (z.B. [-0.000001|0.000001]) zu interpretieren ist auch nicht sonderlich sinnvoll :D
Wie stell ich das an, außer etwas damit zu berechnen (1.0/x oder so) und zu gucken ob -1.#IND rauskommt? Eventuell Kann man das Ergebnis mit 1.0 ja noch darstellen, mit 100.0 aber nicht mehr. Exceptions werden nicht geworfen und ich möchte sie eigentlich auch vermeiden, es geht doch ein bisschen um Performance^^
cout gibt mir diese Nullen als '0' und nicht 1.0e-308 oder so, also muss es ja eine Möglichkeit geben.

busybyte 4. Apr 2008 00:38

Re: floats auf Null prüfen (C++)
 
RoundTo Routine

Rounds a floating-point value to a specified digit or power of ten using "Banker's rounding".

Unit
Math

Syntax


[Delphi] function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;


Description
Call RoundTo to round AValue to a specified power of ten.

AValue is the value to round.

ADigit indicates the power of ten to which you want AValue rounded. It can be any value from –37 to 37 (inclusive).

RoundTo uses "Banker's Rounding" to determine how to round values that are exactly midway between the two values that have the desired number of significant digits. This method rounds to an even number in the case that AValue is not nearer to either value.

The following examples illustrate the use of RoundTo:
Expression Value
RoundTo(1234567, 3)
1234000

RoundTo(1.234, -2)
1.23

RoundTo(1.235, -2)
1.24

RoundTo(1.245, -2)
1.24










SimpleRoundTo Routine

Rounds a floating-point value to a specified digit or power of ten using asymmetric arithmetic rounding.

Unit
Math

Syntax


[Delphi] function SimpleRoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;


Description
Call SimpleRoundTo to round AValue to a specified power of ten.

AValue is the value to round.

ADigit indicates the power of ten to which you want AValue rounded. It can be any value from –37 to 37 (inclusive).

SimpleRoundTo uses asymmetric arithmetic rounding to determine how to round values that are exactly midway between the two values that have the desired number of significant digits. This method always rounds to the larger value.

The following examples illustrate the use of SimpleRoundTo:
Expression Value
SimpleRoundTo(1234567, 3)
1234000

SimpleRoundTo(1.234, -2)
1.23

SimpleRoundTo(1.235, -2)
1.24

SimpleRoundTo(-1.235, -2)
-1.23


Related Information
Math.RoundTo

Muetze1 4. Apr 2008 00:42

Re: floats auf Null prüfen (C++)
 
@busybyte: Und was nützen einem diese Delphi Funktionen in C++?

Wenn er den C++Builder nutzen würde, dann könnte er direkt die Funktion Delphi-Referenz durchsuchenSameValue() nutzen. Diese wäre in diesem Falle selbst bei Delphi deutlich passender und besser geeignet. Somit: er hätte bestimmt nicht gefragt, wenn es der C++Builder wäre bzw. ein Studio...

busybyte 4. Apr 2008 00:48

Re: floats auf Null prüfen (C++)
 
@Muetze1
ok wenn er das für c++ haben will,dann ist wohl ein c++ Forum erfolgversprechender.
:wiejetzt: andere Baustelle

wenn er genau 0 haben will kann er auch IsZero verwenden,wollte es halt flexibel halten.

JasonDX 4. Apr 2008 00:49

Re: floats auf Null prüfen (C++)
 
Ich glaube, auf Intervall prüfen ist die beste Möglichkeit - was anderes außer die Stellen, die durch Konvertierungsfehler ungenau werden könnten, zu ignorieren gibts in meinen Augen nicht. ;)
Ein
Code:
(abs(x) < e)
dürfte dabei auch performant eine akzeptable Lösung sein.

[Edit]Man darf hier auch gerne C-Fragen stellen. Schließlich ist eine entsprechende Personality auch im BDS enthalten ;)
@busbyte: Du kannst auch gerne einfach eine Delphi-Referenz durchsuchenHilfe-Referenz angeben, statt den gesamten Inhalt zu kopieren ;)


greetz
Mike

SnuffMaster23 4. Apr 2008 09:20

Re: floats auf Null prüfen (C++)
 
@busybyte: Damit hätte ich ja eine Null die von -0.5 bis 0.5 geht, das ist doch ein bisschen groß :D
Runden kann ich schon :D

Und ob es jetz um C++ oder um Delphi geht ist doch egal, das Problem hat man in jeder Sprache wo man floats benutzen kann.

@JasonDX: Jo dann werd ich das so machen, nur den Funktionssprung von abs kann ich mir noch sparen. Entweder (x<e || x>-e) oder ((x&0x7FFFFFFF)<e). Bleibt nur die Frage welches da jetzt schneller ist :D
Auf Delphi, zum nachvollziehen: ((x<e) or (x<-e)) und ((x and $7FFFFFFF) < e)

busybyte 4. Apr 2008 09:48

Re: floats auf Null prüfen (C++)
 
@snuffmaster dann schreib es doch in Hebräisch oder Russisch bzw. assembler wenn dir die sprache egal ist und
Gratulation das Du schon runden kannst, suchen scheint ja nicht Deine Stärke zu sein.
Off

Daniel 4. Apr 2008 18:03

Re: floats auf Null prüfen (C++)
 
Hey busybyte,

Zitat:

Zitat von busybyte
@snuffmaster dann schreib es doch in Hebräisch oder Russisch bzw. assembler wenn dir die sprache egal ist und
Gratulation das Du schon runden kannst, suchen scheint ja nicht Deine Stärke zu sein.
Off

ich bitte um einen gemäßigteren Tonfall. Das Vergleichen von Fließkommazahlen ist tatsächlich ein grundsätzliches Problem, das prinzipbedingt sprach-übergreifend existiert. Und die gängigen Lösungsansätze sind in der Tat bei allen Sprachen vergleichbar.

DMW 4. Apr 2008 18:07

Re: floats auf Null prüfen (C++)
 
Zitat:

Zitat von SnuffMaster23
Entweder (x<e || x>-e) oder ((x&0x7FFFFFFF)<e).

Letzteres ist mit C++ syntaktisch so nicht möglich, da für Gleitkommatypen keine Bitoperatoren exisiteren. Da Gleitkommazahlen aber genormt sind, braucht dich das nicht daran zu hindern, es trotzdem so zu machen:
Code:
inline bool isNull (float val, float e = 0.00001f)
{
    *reinterpret_cast <int*> (&val) &= 0x7FFFFFFF;
    return (val < e);
}
inline bool isNull (double val, double e = 0.000000001)
{
    *reinterpret_cast <long long*> (&val) &= 0x7FFFFFFFFFFFFFFFul;
    return (val < e);
}
Für vorzeichenbehaftete Integerwerte funktioniert deine Vergleichsmethode übrigens auch nicht, da diese anders dargestellt werden, als du annimmst; hier am Beispiel einer 1-Byte-Zahl:
http://img138.imageshack.us/img138/9...gnedintml7.gif
Aus diesem Grund ist ~0 (der unäre Operator ~ in C negiert den Parameter bitweise) gleichwertig mit -1, unabhängig davon, wie breit der Datentyp ist.

Chemiker 4. Apr 2008 18:29

Re: floats auf Null prüfen (C++)
 
Hallo SnuffMaster23,

mit [C++]
Code:
bool IsZero (long double A, long double Epsilon);
kann man Prüfen ob die Gleitkommazahl den Wert Null oder beinahe Null hat.
Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz