AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

floats auf Null prüfen (C++)

Ein Thema von SnuffMaster23 · begonnen am 4. Apr 2008 · letzter Beitrag vom 5. Apr 2008
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#1

floats auf Null prüfen (C++)

  Alt 4. Apr 2008, 00:54
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
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.
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
busybyte

Registriert seit: 15. Sep 2006
165 Beiträge
 
#2

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

  Alt 4. Apr 2008, 01:38
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
I love DiscCat
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

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

  Alt 4. Apr 2008, 01:42
@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...
  Mit Zitat antworten Zitat
busybyte

Registriert seit: 15. Sep 2006
165 Beiträge
 
#4

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

  Alt 4. Apr 2008, 01:48
@Muetze1
ok wenn er das für c++ haben will,dann ist wohl ein c++ Forum erfolgversprechender.
andere Baustelle

wenn er genau 0 haben will kann er auch IsZero verwenden,wollte es halt flexibel halten.
I love DiscCat
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#5

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

  Alt 4. Apr 2008, 01:49
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#6

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

  Alt 4. Apr 2008, 10:20
@busybyte: Damit hätte ich ja eine Null die von -0.5 bis 0.5 geht, das ist doch ein bisschen groß
Runden kann ich schon

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
Auf Delphi, zum nachvollziehen: ((x<e) or (x<-e)) und ((x and $7FFFFFFF) < e)
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
busybyte

Registriert seit: 15. Sep 2006
165 Beiträge
 
#7

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

  Alt 4. Apr 2008, 10:48
@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
I love DiscCat
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 4. Apr 2008, 19:03
Hey busybyte,

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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#9

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

  Alt 4. Apr 2008, 19:07
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.
Moritz
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 4. Apr 2008, 19:29
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:42 Uhr.
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