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

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

1

14.12.2007, 14:50

Problem mit dem == Operator

Ich progge in den letzten Tagen an einem Programm für Kurvendiskussionen und scheine nun plötzlich bei einem banalen noob-problem zu hängen:
bei folgendem Code wird kein Text ausgegeben. nicht einmal, wenn man ihn kompilliert und ausführt! :shock: Ändert man aber die Zählerrate (->Kommentar) funzt es plötzlich.
Ich habe das Ganze debugged und i wird tatsächlich haargenau -3, das Programm führt die Bedingung aber nicht aus. Was mir noch aufgefallen ist: i nimmt manchmal Werte wie 2.599999 an. In perl gibt es sowas wie ein ungenaues Rechnen des Rechners, wobei dann solche Probleme auftreten können. Ist das hier auch so ähnlich?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

using namespace std;

int main (){
    for (float i=-10.0f; i <= 10.0f; i += 0.1f ){  // Ändert man das letzte in i += 1 funzts

        if (i==-3.0f){
            cout << "#####found#####\n";
        }
    }
    return 0;
}

Projekt neu erstellen hab ich schon versucht

PS: Ich benutze Microsoft VS C++ 2005 Express

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

2

14.12.2007, 14:55

Jap ist hier genau so, Float kann gewisse Zahlen einfach nicht genau darstellen.

Entweder mit int arbeiten, wenns genau sein muss, oder
wenn man wirklich float-werte auf gleichheit prüfun muss, dann immer
einen folgendermaßen:

C-/C++-Quelltext

1
2
3
float const EPSILON = 0.00000001f;

bool compare(float a, float b) {return (a < b + EPSILON) && (a > b - EPSILON);}

mfg Philipp

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

3

14.12.2007, 15:10

Superdanke für die schnelle Antwort!. Das ist aber eine ganz raffinierte Bitverknüpfung (Das ist doch eine, oder?), ich kenn mich zwar ein Bisschen damit aus, habe sie aber nicht durcblickt. Nebensache, haupsache es funzt. Ich kann nämlich wirklich nicht auf Kommazahlen verzichten, da ich die Nullstellen von der Funktion austesten muss.
Es gibt sicher elegantere und effektivere Methoden, aber mit Gleichungen habe ich bis jetzt noch nie programmiertechnisch zu tun gehabt. Wenn ich aber schon mal dabei bin: Was gibt es denn da für Techniken?

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

4

14.12.2007, 15:12

Hmm glaub net, siehst du da nen binären operator ?

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

5

14.12.2007, 18:48

@databyte: Ja, Ich hab mir das Ganze nicht wirklich angeschaut. Als ich es dann in den Quellcode eingefügt habe habe ich bemerkt, wie das Funktioniert. Jezt im Nachhinein weis ich auch nicht mehr, wie ich && und & verwechseln konnte :?

Die Frage mit der Gleichung ist wohl nicht so einfach zu beantworten.
Soll ich vielleicht einen neuen Thread eröffnen?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

14.12.2007, 18:52

eine möglichkeit http://www.google.com/search?hl=de&q=newtonsches+nullstellen
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

7

14.12.2007, 18:54

So, und nun zurück zu meinem Problem: Das mit der Rundungsfunktion ist nur eine Notlösung. Mit der Zeit bekomme ich sehr ungenaue Ergebnisse, die ich schlecht weiterbenutzen kann.
Eine weitere Notlösung wäre, wenn ich die Zahl immer wieder auf 5 Kommastellen runde.
Wie macht man das? und was wäre eine bessere Lösung?

Sicaine

unregistriert

8

14.12.2007, 19:01

Mehr genauigkeit, genaueren Datentyp? Double?

Bugger

Frischling

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

9

14.12.2007, 19:16

Runden kannst du mit floor() - allerdings nur auf ganze Zahlen - also musst du folglich für x Stellen:

floor(zahl*10^x)/10^x;

für 2

floor(zahl*100)/100;

du brauchst übrigends math.h dafür

10

14.12.2007, 21:12

Wenn es so simpelwie in deinem Beispiel bleibt kannst du doch ganze Zahlen verwenden.

Wenn du mit der Kommastelle arbeiten willst kannst du am ende ja durch 10, 100 oder was auch immer teilen

Werbeanzeige