karabouzouk... Δημοσ. 7 Μαρτίου 2009 Δημοσ. 7 Μαρτίου 2009 >#include<stdio.h> #define foros 0.33439 void main() { float timi,timpolkaiforos,timitelxwrisforos,litra,epforou; printf("\n\nDwse timh polishs... --> "); scanf("%f", &timi); printf("Dwseposothta se litra.. -->"); scanf("%f", &litra); timpolkaiforos=(timi+foros)*litra; epforou=foros*litra; timitelxwrisforos=timpolkaiforos-epforou; printf("\n\nTelikh timh --> %f\n\n", timitelxwrisforos); system("pause"); } Το κάνω compile με turbo c 3 και δεν έχω σφάλματα... αλλά διαπίστωσα ότι στους δύο πολλαπλασιασμούς κάνει κάποιο λάθος... με απλές πράξεις που δοκίμασα μετα τον πολλαπλασιασμό εχει κατά 0.000015 λαθος το αποτέλεσμα η κατι τέτοιο... ας το δοκιμάσει κάποιος με έναν λιγότερο αρχαίο compiler να δώ τι φταίει..! Ευχαριστώ..!
jtsc21 Δημοσ. 7 Μαρτίου 2009 Δημοσ. 7 Μαρτίου 2009 >#include<stdio.h> #define foros 0.33439 [b][color="Red"][size="4"][size="5"]void main() [/size][/size][/color][/b]{ float timi,timpolkaiforos,timitelxwrisforos,litra,epforou; printf("\n\nDwse timh polishs... --> "); scanf("%f", &timi); printf("Dwseposothta se litra.. -->"); scanf("%f", &litra); timpolkaiforos=(timi+foros)*litra; epforou=foros*litra; timitelxwrisforos=timpolkaiforos-epforou; printf("\n\nTelikh timh --> %f\n\n", timitelxwrisforos); system("pause"); } Το κάνω compile με turbo c 3 και δεν έχω σφάλματα... αλλά διαπίστωσα ότι στους δύο πολλαπλασιασμούς κάνει κάποιο λάθος... με απλές πράξεις που δοκίμασα μετα τον πολλαπλασιασμό εχει κατά 0.000015 λαθος το αποτέλεσμα η κατι τέτοιο... ας το δοκιμάσει κάποιος με έναν λιγότερο αρχαίο compiler να δώ τι φταίει..! Ευχαριστώ..! η συναρτηση main δεν επιστρεφει void αλλα int. αν το προγραμμα τερματισει επιτυχως επιστρεφει 0 αλλιως 1 οποτε στη γραμμη με το κοκκινο γραψε int main(void) και εισαι ok ακομα αν θες μεγαλυτερη ακριβεια αντι για float ορισε τις μεταβλητες σου double
parsifal Δημοσ. 7 Μαρτίου 2009 Δημοσ. 7 Μαρτίου 2009 Το κάνω compile με turbo c 3 και δεν έχω σφάλματα... αλλά διαπίστωσα ότι στους δύο πολλαπλασιασμούς κάνει κάποιο λάθος... με απλές πράξεις που δοκίμασα μετα τον πολλαπλασιασμό εχει κατά 0.000015 λαθος το αποτέλεσμα η κατι τέτοιο... ας το δοκιμάσει κάποιος με έναν λιγότερο αρχαίο compiler να δώ τι φταίει..! Ευχαριστώ..! Δώσε τις τιμές εισόδου που χρησιμοποίησες και εξόδου που πήρες, για να μπορεί να γίνει σύγκριση αποτελεσμάτων...
karabouzouk... Δημοσ. 7 Μαρτίου 2009 Μέλος Δημοσ. 7 Μαρτίου 2009 Δεν νομίζω ότι η main επιστρέφει κάποια τιμή όπως και να την έχω δηλώσει από τη στιγμή που δεν έχω βάλει πουθενά return και πόσο μάλλον τώρα που την έχω δηλώσει και void (που σημαίνει ότι δεν επιστρέφει τίποτα)... Βασικά δεν νομίζω ότι έχει να κάνει με το λάθος αυτο που παρατηρώ στις πράξεις... και δεν μπορώ να φανταστώ τι μπορεί να φταίει... Πχ όταν βάζω για την πρώτη μεταβλητή 2 και τη δευτερη 500 αντι να πάρω 1000 που είναι το σωστό βγάζει 999,99937 ή κάτι τέτοιο...
jtsc21 Δημοσ. 7 Μαρτίου 2009 Δημοσ. 7 Μαρτίου 2009 Δεν νομίζω ότι η main επιστρέφει κάποια τιμή όπως και να την έχω δηλώσει από τη στιγμή που δεν έχω βάλει πουθενά return και πόσο μάλλον τώρα που την έχω δηλώσει και void (που σημαίνει ότι δεν επιστρέφει τίποτα)... Βασικά δεν νομίζω ότι έχει να κάνει με το λάθος αυτο που παρατηρώ στις πράξεις... και δεν μπορώ να φανταστώ τι μπορεί να φταίει...Πχ όταν βάζω για την πρώτη μεταβλητή 2 και τη δευτερη 500 αντι να πάρω 1000 που είναι το σωστό βγάζει 999,99937 ή κάτι τέτοιο... παντως η main σε καμια περιπτωση δεν μπορει να δηλωθει void γιατι πολυ απλα ο compiler φωναζει.... τωρα οσον αφορα αυτο που λες δοκιμασε αντι για float να βαλεις double
parsifal Δημοσ. 7 Μαρτίου 2009 Δημοσ. 7 Μαρτίου 2009 Η απόκλιση οφείλεται σε 2 παράγοντες: 1. Κάθε φορά που γίνονται πράξεις κινητής υποδιαστολής, πιθανόν να υπεισέλθει σφάλμα-απόκλιση λόγω του τρόπου με τον οποίο αναπαρίστανται οι πραγματικοί αριθμοί στον υπολογιστή (πεπερασμένη ακρίβεια) 2. Ενώ μπορείς να υπολογίσεις την τιμή της μεταβλητής timitelxwrisforos απευθείας με έναν πολλαπλασιασμό (timi * litra;), εσύ την υπολογίζεις με περισσότερες από μία πράξεις που εμπλέκουν πραγματικούς αριθμούς. Λόγω και του 1 --> μεγαλύτερη πιθανότητα να εισάγεις σφάλμα -απόκλιση Ο παρακάτω κώδικας : >#include <stdio.h> #include <stdlib.h> int main() { const float foros = 0.33439; float timi, timpolkaiforos, timitelxwrisforos, litra, epforou; printf("\n\nDwse timh polishs --> "); scanf("%f", &timi); printf("Dwse posothta se litra --> "); scanf("%f", &litra); epforou = foros * litra; timitelxwrisforos = timi * litra; timpolkaiforos = timitelxwrisforos + epforou; printf("\n\nTelikh timh --> %f\n\n", timitelxwrisforos); /* system("pause"); */ return EXIT_SUCCESS; } γίνεται compile σε gcc 4.3.2 χωρίς σφάλματα ή warnings : >parsifal@vm-intrepid:/tmp$ gcc -Wall -o test test.c parsifal@vm-intrepid:/tmp$ ...και για τις ενδεικτικές τιμές εισόδου που ανέφερες (timi = 2 και litra = 500) δίνει αποτέλεσμα 1000 : >parsifal@vm-intrepid:/tmp$ ./test Dwse timh polishs --> 2 Dwse posothta se litra --> 500 Telikh timh --> 1000.000000 parsifal@vm-intrepid:/tmp$ Ελπίζω να βοήθησα...
ippo00 Δημοσ. 7 Μαρτίου 2009 Δημοσ. 7 Μαρτίου 2009 Βασικά το void δεν είναι αυτό που προκαλεί το πρόβλημα... και στο κάτω κάτω το προγραμμά τηα κάνει compile me warning. Α, και κάτι άλλο.. γιατί να γράψεις 'int main' και όχι σκετο 'main' ?
gtroza Δημοσ. 7 Μαρτίου 2009 Δημοσ. 7 Μαρτίου 2009 http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284376&answer=1044841143 .
karabouzouk... Δημοσ. 7 Μαρτίου 2009 Μέλος Δημοσ. 7 Μαρτίου 2009 Δεν με ενδιαφέρει μόνο το τελικό αποτέλεσμα αλλά και τα ενδιάμεσα άλλο που εδώ όπως το έγραψα δεν τα εμφανίζω κάπου.. Για τη main δεν βάζω το χέρι μου στη φωτιά αλλά νομίζω ότι μπορεί να δηλωθεί και σαν void που όπως και να έχει αποκλείεται να δημιουργεί αυτό το πρόβλημα... Αν δοκιμάσεις να κάνεις τις πράξεις με το χέρι θα δεις ότι δεν χρειάζεται παραπάνω από 5 δεκαδικά και έτσι δεν παίζει να φταίει αυτό.. και το κουλό που δοκίμασα για να σιγουρευθώ έκανα 0*1000 και πάλι έβγαλε 0,0000015...πάντως όχι 0....
Directx Δημοσ. 7 Μαρτίου 2009 Δημοσ. 7 Μαρτίου 2009 Δοκίμασε να περιορίσεις τα ψηφία μετά την κινητή υποδιαστολή. Έτσι άλλαξε το %f της τελικής τιμής ( printf("\n\nTelikh timh --> %f\n\n", timitelxwrisforos);) σε %.2f ώστε να έχεις ακρίβεια 2 ψηφίων (στρογγυλοποίηση) οπότε 2 * 500 = 1000,00 διαφορετικά αν %f = 999.999939 . Όσον αφορά το 0*1000 στον Compiler μου (C++ Builder) επιστρέφει φυσικά 0. Τέλος ρίξε μια ματιά στο κλασσικό πια What Every Computer Scientist Should Know About Floating-Point Arithmetic: http://docs.sun.com/source/806-3568/ncg_goldberg.html Καλή τύχη!
evabb Δημοσ. 7 Μαρτίου 2009 Δημοσ. 7 Μαρτίου 2009 Δεν νομίζω ότι η main επιστρέφει κάποια τιμή όπως και να την έχω δηλώσει από τη στιγμή που δεν έχω βάλει πουθενά return και πόσο μάλλον τώρα που την έχω δηλώσει και void (που σημαίνει ότι δεν επιστρέφει τίποτα)... Βασικά δεν νομίζω ότι έχει να κάνει με το λάθος αυτο που παρατηρώ στις πράξεις... και δεν μπορώ να φανταστώ τι μπορεί να φταίει...Πχ όταν βάζω για την πρώτη μεταβλητή 2 και τη δευτερη 500 αντι να πάρω 1000 που είναι το σωστό βγάζει 999,99937 ή κάτι τέτοιο... ναι το void δεν εχει να κανει με τις πραξεις που λες αλλα να ξερεις οτι παντα μα παντα η main επιστρεφει κατι και ειναι παντα int ειτε του εχεις βαλει return ειτε οχι.
WordUp Δημοσ. 8 Μαρτίου 2009 Δημοσ. 8 Μαρτίου 2009 Να κάνω και εγώ μια ερώτηση ρε παιδιά; Ποστάρω εδώ για να μην ανοίγω άλλο thread άσκοπα, και το ερώτημά μου έχει να κάνει πάλι με floating point calculations. Λοιπόν, έχω γράψει το παρακάτω προγραμματάκι >#include <stdio.h> #include <math.h> float calc(float n1, float n2); int main(void) { float num1, num2, result; printf("Enter two floating point numbers (q to quit): "); while (scanf("%f %f", &num1, &num2) == 2) { result = calc(num1,num2); printf("\nThe result is %f \n", result); printf("Enter two floating point numbers (q to quit): "); result = 0; } return 0; } float calc(float n1, float n2) { return (fabs(n1-n2)/(n1*n2)); //επιστρέφει το πηλίκο της απόλυτης τιμή της διαφοράς των δύο αριθμών με το γινόμενο τους } Γιατί αν δηλώσω τις μεταβλητές ως double αλλά και το return type της συνάρτησης ως double, δίνει άκυρα αποτελέσματα του στυλ: > Enter two floating point numbers (q to quit): 2 1 The result is 11298...565.000000 (μην κάνετε σχόλια γιατί έχω βάλει την πράξη σε function, άσκηση είναι...) Εάν τις κάνω float, no problem :/
karabouzouk... Δημοσ. 9 Μαρτίου 2009 Μέλος Δημοσ. 9 Μαρτίου 2009 ναι το void δεν εχει να κανει με τις πραξεις που λες αλλα να ξερεις οτι παντα μα παντα η main επιστρεφει κατι και ειναι παντα int ειτε του εχεις βαλει return ειτε οχι. Η main() είναι μια συνάρτηση όπως όλες οι άλλες με τη μόνη διαφορά ότι είναι η μόνη απαραίτητη για να "υπάρξει" ένα πρόγραμμα στη C... Άρα αυτό σημαίνει ότι όπως κάθε άλλη συνάρτηση μπορείς να την δηλώσεις ό,τι τύπο δεδομένων θέλεις (ανάλογα με το τι χρειάζεσαι) έτσι και τη main() ανάλογα με το τί θα την δηλώσεις πρέπει να επιστρέψεις και τον ανάλογο τύπο δεδομένων...... Έτσι αν την δηλώσεις void δεν θα επιστρέψεις (και δεν μπορείς να επιστρέψεις) τίποτα... Άσχετα με το αν η επιστροφή ενώς ακεραίου στη main σε βοηθάει να καταλάβεις σε τι κατάσταση είναι το πρόγραμμαμα, δεν σημαίνει σε καμία περίπτωση ότι είναι και υποχρεωτικό να επιστρέψεις κάτι... Μια σελίδα που βρήκα γι αυτό το θέμα http://users.aber.ac.uk/auj/voidmain.shtml λέει ότι ο ορισμός της main() σαν void προκαλεί και άλλα προβλήματα κάτω από ορισμένες συνθήκες όπως crash-αρισμα της εφαρμογής και όπως είπες καλό είναι να βαζουμε ένα return 0 στο τέλος μιας int main()... Τέσπα αυτά είναι λίγο offtopic αλλά ίσως χρήσιμα ως γνώσεις..
karabouzouk... Δημοσ. 10 Μαρτίου 2009 Μέλος Δημοσ. 10 Μαρτίου 2009 >#include<stdio.h> int main () { float y=500,x=0.33439, p; p=x*y; printf("\n\n...... %f\n\n", p); return 0; } Ακόμη κανείς δεν βρήκε τίποτα γι αυτό το θέμα....?? Τρέχοντας απλά το παραπάνω προγραμματάκι που κάνει έναν πολλαπλασιασμό μου βγάζει αποτέλεσμα 167,195007 ενώ το κανονικό αποτέλεσμα είναι 167,195... Σε εσάς γίνεται έτσι η βγάζει το κανονικό αποτέλεσμα...? Καμιά πρόταση.. καμιά εξήγηση...?
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.