Hallo, erstmal vorweg, ich bin nun im zweiten Semester meines Maschinenbau Studiums angekommen, und dort beginnen wir gerade mit der Programmierung in ANSI-C.
Vorkenntnisse im Programmieren habe ich schon einige wenige (Angefangen mit VB .NET 2005, und dannach immer mal wieder kleine Tools zum Umrechnen mit z.b. Java und C# geschrieben. Ausserdem einige Programme für microkontroller mit Bascom (Basic) entwickelt)
Nunja nun habe ich allerdings auch schon längere Zeit nichts mehr damit gemacht, allerdings bin ich mir ziemlich sicher das ich bisher folgendes Problem noch nicht hatte.
Also eine der ersten Aufgaben war nun ein Programm zu erstellen, das DM in Euro umrechnet, und das für alle Werte von 0.10DM - 20 DM in 0.10 DM Schritten.
Eigentlich hab ich gedacht, hah kinderkram und das Programm eben fix hingeschrieben.
Programm:
#include <stdio.h>
main()
{
double lower, upper, step;
double DM, EUR;
lower = 0.10f; /* untere Grenze der Temperaturtabelle */
upper = 20.00f; /* obere Grenze */
step = 0.10f; /* Schrittweite */
DM = lower;
printf("\n\nDM EURO\n\n");
while (DM <= upper) {
EUR = (DM/1.95583f);
printf("%6.2f DM | %6.2f EUR\n",DM ,EUR);
DM = DM + step;
printf("%30.20f\n",DM);
}
printf("\n");
getch();
}
Nunja nur macht mir da nun der ungenaue float einen Strich durch die Rechnung. Die zusätzliche ausgabe nach dem aufaddieren der DM habe ich nachträglich eingebaut, und bin dadurch darauf gekommen das einige stellen hinter dem Komma deutliche Rundungsfehler auftauchen.
Erst konnte ich mir darauf keinen Reim machen warum bei derart einfachen Addition dahinten Rundungsfehler auftauchen.
Nun weiß ich mittlerweile das es dran liegt, dass sich die Nachkommastellen nicht in 1/Zweierpotenzen zerlegen lassen, und dadurch das ganze auf dichtesten Wert gerundet wird der eben so darstellbar ist.
ich könnte natürlich nun auch einfach eine int Zähler variable benutzen für die while schleife, aber ich finde das das ein wenig naja sinnloser Aufwand für einen so einfachen vergleich wäre.
Ist es möglich bei der Auswertung des Argumentes der While schleife einfach alle Nachkommastellen ab der 4ten stelle oder so abzuschneiden, das zuguter letzt der vergleich DM <= upper doch noch hinhaut.
Hier mal die (gekürzte) Ausgabe des Programmes:
DM EURO
0.10 DM | 0.05 EUR
0.20000000298023224000
0.20 DM | 0.10 EUR
0.30000000447034836000
0.30 DM | 0.15 EUR
0.40000000596046448000
0.40 DM | 0.20 EUR
0.50000000745058060000
......
......
......
......
19.60 DM | 10.02 EUR
19.70000029355287600000
19.70 DM | 10.07 EUR
19.80000029504299200000
19.80 DM | 10.12 EUR
19.90000029653310800000
19.90 DM | 10.17 EUR
20.00000029802322400000
Und da ist klar 20.000000298... ist nunmal nichtmehr == 20.00 sondern größer, wie bekomme ich es hin das mit dem direkten vergleich trotzdem direkt zum Ziel komme ?
Hoffe ihr könnt mir da etwas weiterhelfen....
Ab jetzt OffTopic:
Warum wird man hier bei der Registrierung im Forum mit einem google mail Konto dermaßen diskriminiert ? Ich hab ja nichts gegen die meinung der Leute die aus Datenschutzgründen ein Problem mit google haben, allerdings teilen nicht alle diese meinung.Ich finde das sollte wirklich jeder selber entscheiden ob er seine Daten Google in die Hand drücken will oder nicht. Nun musste ich mein altes verstaubtes Live Konto wieder ausgraben nur um mich hier Registrieren zu können. Ist zwar nicht so das Problem aber verstehen kann ich diese "abweisung" wirklich nicht .....
EDIT:
Ok, das Thema hat sich geklärt ich habe den Thread zu dem Thema gefunden. Rückläufige Mails sind der Hauptgrund, den ich zwar nicht nachvollziehen kann, da man die normal ja über Regeln ausfiltern könnte, aber naja ok, seis so. Und nein ich habe auch kein Problem damit das meine E-Mails anonym nach Themengebieten gescannt werden um Werbeanzeigen gezielter auszurichten. Würde es solches oder ähnliches vorgehen nicht geben bezweifel ich mal stark das Diese internetwerbung so stark vertreten wäre. Und ich persönlich habe damit kein problem wo sich doch fiele open source und freeware projekte zum teil durch eben sowas finanzieren. Und ich find Freeware nicht schlecht..
Aber darüber will ich hier KEINE Diskussion lostreten.
mfg
Jens