zarzonis Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Γράφω ένα πρόγραμμα για τη σχολή σε c και μο βγάζει πρόβλημα στη στρογγυλοποίηση τιμών. Χρησιμοποιώ τη συνάρτηση round. Ρίξτε μια ματιά στην παρακάτω φωτογραφία. Ενώ έπρεπε να εμφανίζει 218, εμφανίζει 217. Ο κώδικας ενσωματώνεται σε πολύ πιο μεγάλο πρόγραμμα, αλλά το λάθος ξεκινάει από εδώ.
Technology fan Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Μια χαρά στο βγάζει... http://www.codecogs.com/library/computing/c/math.h/round.phpround of 12.5 is 12.0
Demon Lord Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Νομίζω ότι η στρογγυλοποίηση γίνεται από το 5 και πάνω παίρνοντας και το 5 μαζί! Άρα θα έπρεπε να είναι 12,5--->13,0 πιστεύω
bird Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 (επεξεργασμένο) Όντως κακώς στρογγυλοποιεί το α.5 στο α κι όχι στο α+1. Αν θες να σου δουλέψει κάνε αυτό: double test1 = 0; int rounded; test1 = (double)2.25*58./60.; test1 *= 1000; test1 /= 10; rounded = round(test1); Έτσι δουλεύει Αλλιώς φτιάξε δικιά σου round edit: Για να δουλεύει το ένα και να μη δουλευει το άλλο, υποθέτω έχει να κάνει με την ακρίβεια και το πως αποθηκευεται ο αριθμός στον double. Μάλλον στην πρώτη περίπτωση το 217.5 είναι κάτι σαν 217.499999..... ενώ στη δευτερη 217.50000...1. Δεν έχω ασχοληθεί πολυ με την ακρίβεια και το σφάλμα των αριθμών, οπότε κάποιος άλλος θα μπορουσε να μας διαφωτίσει. Επεξ/σία 24 Νοεμβρίου 2013 από bird
zarzonis Δημοσ. 24 Νοεμβρίου 2013 Μέλος Δημοσ. 24 Νοεμβρίου 2013 Από τη σχολή μας έχουν δώσει κάποια αρχεία εισόδου και εξόδου και σε αυτή την τιμή πρέπει να βγάζει 218 και όχι 217. Σε ότι άλλες τιμές και να έχω δοκιμάσει, ακόμα και σε αυτές που δίνουν από τη σχολή, δεν βγάζει πρόβλημα. Από τα μαθηματικά εγώ ξέρω ότι 217.5 στρογγυλοποιημένο πρέπει να βγάζει 218. Επίσης δείτε λίγο αυτό εδώ που έκανα τώρα. Μάλλον το πρόβλημα δημιουργείται επειδή ο αριθμός βάση bit δεν αποθηκεύεται ακριβώς 112.5 αλλά 112.49999999.... Με τον κώδικα που έγραψα τώρα, δουλεύει και αυτό αλλά και η στρογγυλοποίηση του 12.5 σε 13 κανονικά. Θέλω να μου πείτε αν βλέπετε κάποιο λάθος σε αυτό τώρα. Ουσιαστικά δέχομαι μια απόκλιση στον υπολογισμό. EDIT: bird με πρόλαβες. Δεν ξέρω αν βοηθάει, αλλά τα νούμερα που υπολογίζω, έχουν να κάνουν με υπολογισμό κόστους σε cents. Δηλαδή το 217 είναι 217 cents που προέκυψε από ένα συγκεκριμένο υπολογισμό. Οπότε θέλω να γίνεται 127 cents ή 128 cents ανάλογα.
bird Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Θα μπορούσες να το κάνεις και πιο γρήγορα αν απλά βάλεις rounded = round(test1+0.01) // όπου στο 0,01 βάλε την ακρίβεια που θέλεις να έχεις Επίσης αυτό θα δουλεύει αν οι αριθμοί σου είναι θετικοί. Αν είναι αρνητικοί θα πρέπει να αφαιρείς την ακρίβεια ή στην if την δικιά σου να πάρεις απόλυτη τιμή... 1
albNik Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 To round(a+0.5) ειναι παντα ίδιο με round(a) , εκτος ότι στρογγυλοποιει προς τα πανω αν α=x.5.
bird Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 To round(a+0.5) ειναι παντα ίδιο με round(a) , εκτος ότι στρογγυλοποιει προς τα πανω αν α=x.5. Δηλαδή το round(1.3+0.5) είναι το ίδιο με το round(1.3) ???? Αυτό που κάνει η round(a) στην ουσια είναι να επιστρέφει το (int)(a+0.5). Ίσως να ενοείς αυτό....
zarzonis Δημοσ. 24 Νοεμβρίου 2013 Μέλος Δημοσ. 24 Νοεμβρίου 2013 Το να ελέγξω αν οι αριθμοί που εισάγωνται είναι θετικοί, δε με ενδιαφέρει στη συγκεκριμένη άσκηση γιατί η εκφώνηση λέει να υποθέσουμε ότι όλοι οι αριθμοί που εισάγωνται είναι θετικοί. Bird η λύση σου να ενσωματώσω το σφάλμα μέσα στη round είναι σωστή. Δεν μπορώ να καταλάβω όμως πόσο είναι η τυπική απόκλιση που θέλω. Έχω μπερδευτεί. Είπα ότι ο αριθμός που υπολογίζω είναι cents. Οπότε θέλω ένας αριθμός που είναι 112.49999 να γίνει 113 cents, όταν είναι 112.45 να γίνει πάλι 113 ενώ όταν είναι 112.43 να γίνει 112. Αυτό έτσι δεν το κάνω; rounded = round(test1+0.05);
bird Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Το να ελέγξω αν οι αριθμοί που εισάγωνται είναι θετικοί, δε με ενδιαφέρει στη συγκεκριμένη άσκηση γιατί η εκφώνηση λέει να υποθέσουμε ότι όλοι οι αριθμοί που εισάγωνται είναι θετικοί. Bird η λύση σου να ενσωματώσω το σφάλμα μέσα στη round είναι σωστή. Δεν μπορώ να καταλάβω όμως πόσο είναι η τυπική απόκλιση που θέλω. Έχω μπερδευτεί. Είπα ότι ο αριθμός που υπολογίζω είναι cents. Οπότε θέλω ένας αριθμός που είναι 112.49999 να γίνει 113 cents, όταν είναι 112.45 να γίνει πάλι 113 ενώ όταν είναι 112.43 να γίνει 112. Αυτό έτσι δεν το κάνω; rounded = round(test1+0.05); Κοίτα, μαθηματικά το 112.45 πρέπει να στρογγυλοποιηθεί στο 112. Αν εσύ στα πλαίσια της άσκησης θέλεις να το στρογγυλοποιείς στο 113 τότε νομίζω ότι θα σου δουλέψει σωστά το round(test1+0.05) αλλιώς σου αρκεί και το round(test1+0.01) (αυτά δεν κάθομα να τα τεστάρω, στα λέω πολύ γρήγορα οπότε μπορεί και να κάνω και λάθος, έτσι; )
albNik Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Δηλαδή το round(1.3+0.5) είναι το ίδιο με το round(1.3) ???? Αυτό που κάνει η round(a) στην ουσια είναι να επιστρέφει το (int)(a+0.5). Ίσως να ενοείς αυτό.... Ουπς .., ναι αυτο
zarzonis Δημοσ. 24 Νοεμβρίου 2013 Μέλος Δημοσ. 24 Νοεμβρίου 2013 Κοίτα, μαθηματικά το 112.45 πρέπει να στρογγυλοποιηθεί στο 112. Αν εσύ στα πλαίσια της άσκησης θέλεις να το στρογγυλοποιείς στο 113 τότε νομίζω ότι θα σου δουλέψει σωστά το round(test1+0.05) αλλιώς σου αρκεί και το round(test1+0.01) (αυτά δεν κάθομα να τα τεστάρω, στα λέω πολύ γρήγορα οπότε μπορεί και να κάνω και λάθος, έτσι; ) Εννοείται. Ήδη με βοήθησες. Απλά με το 0.05 ενω βγάζει σωστό αποτέλεσμα στις τιμές αυτές, φοβάμαι μήν έχω θέμα σε άλλες μετά. Το 0.01 από την άλλη είναι πιο ασφαλές και όντως δουλεύει σε αυτές τις τιμές, αλλά είμαι σίγουρος ότι ο υπολογιστής δεν θα έχει μεγαλύτερη απόκλιση από 0.01;
Directx Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Όποτε έχεις χρόνο ρίξε μια ματιά και στις ceil & floor της math.h ίσως φανούν χρήσιμες. 1
bird Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Εννοείται. Ήδη με βοήθησες. Απλά με το 0.05 ενω βγάζει σωστό αποτέλεσμα στις τιμές αυτές, φοβάμαι μήν έχω θέμα σε άλλες μετά. Το 0.01 από την άλλη είναι πιο ασφαλές και όντως δουλεύει σε αυτές τις τιμές, αλλά είμαι σίγουρος ότι ο υπολογιστής δεν θα έχει μεγαλύτερη απόκλιση από 0.01; Αν το πρόβλημά σου είναι μόνο οι περιπτώσεις που σε μία πράξη το αποτέλεσμα είναι α.5 και ο υπολογιστής τον αποθηκευεί α.499999... τότε ακόμα και 0.0000001 να προσθέσεις θα κάνεις τη δουλειά σου...
zarzonis Δημοσ. 24 Νοεμβρίου 2013 Μέλος Δημοσ. 24 Νοεμβρίου 2013 Η ceil στρογγυλοποιεί προς τα πάνω και η floor προς τα κάτω. Το πρόβλημα είναι ότι στην εκφώνηση λέει να χρησιμοποιήσουμε τη round ή την lround ή να βρούμε δικό μας τρόπο(δεν μας έχει μάθει ακόμα να γράφουμε δικές μας συναρτήσεις). Προγραμματισμό ξέρω αλλά με περιορίζουν οι γνώσεις που πρέπει να χρησιμοποιήσω στην περίπτωση. Οπότε πρέπει να βρω έναν τρόπο που θα τον ενσωματώσω μέσα στον υπάρχων κώδικα που έγραψα. @bird η συνάρτηση round αν είναι α.β με β>=5 κάνει κανονικά τη δουλειά της. Το θέμα είναι πως θα αποκλίσω το γεγονός ένας αριθμός 1.49999 δεν αποθηκευτεί στον υπολογιστή κάπως 1.50000001... και ένας αριθμός που είναι 1.50001 δεν αποθηκετεί 1.4999999. Με το σφάλμα που βάζω εγώ μπορεί ένας αριθμός να είναι όντως 1.480000 και εγώ να τον κάνω στρογγυλοποίηση προς τα πάνω προσθέτοντας το σφάλμα που βάζω. Το ίδιο μπορεί να συμβεί και με σφάλμα 0.01 και 0.00001
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα