migf1 Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 (επεξεργασμένο) @imitheos δεν θα το πιστεψεις !!! Ακριβως τωρα εμπαινα να προλάβω τον migf1 για πριν.... γιατι οντως πήγαινε προς τρολαρισμα αυτη τη φορα επειδη εδωσες φραση κλειδι την προηγουμενη φορα (δεν διαβασα το αρθρο που εδωσε το αφησα για αυριο αλλα σαν να μου ηρθε μια καλη ιδεα και τελικα να το βρηκα χωρις να διαβασω ολο αυτο ) ... Το θέμα για μένα είναι πως όταν διαβάζω μια απορία κάποιου που σύμφωνα με τα γραφόμενά του ενδαφέρεται να μάθει, θεωρώ αυτονόητα ότι οντως ενδιαφέρεται να μάθει. Όταν λοιπόν εκφράζεις μια απορία για την ακρίβεια των πραγματικών αριθμών και σου έχει ήδη απαντήσει ο imitheos στα Ελληνικά κι εγώ σε έχω παραπέμψει σε ένα από τα καλύτερα αγγλικά online άρθρα που γνωρίζω για το θέμα, θεωρώ επίσης αυτονόητο πως θα ασχοληθείς πριν επανέλθεις με νέα απορία πάνω στο ίδιο αντικείμενο. Το ερώτημα που προκύπτει από το bold που έχω κάνει στην παραπάνω παράθεση είναι αν όντως ενδιαφέρεσαι να μάθεις τελικά. Διότι το "μου ήρθε μια καλή ιδέα και τελικά το βρήκα χωρίς να διαβάσω όλο αυτό" διαφέρει παρασάγγας ας πούμε από το "με ενδιαφέρει να μάθω τι ακριβώς παίζει οπότε διαβάζω θεωρία μαζί με δοκιμασμένες λύσεις, ώστε και να μου λυθούν πολλές απορίες μαζεμένα, και να μου εντυπωθούν και να έχω πρόχειρη μια πηγή στην οποία μπορώ να επανέλθω μελλοντικά για να φρεσκάρω τη μνήμη μου". Αυτό το τελευταίο είναι κατά τη γνώμη μου ο ενδεδειγμένος τρόπος για όποιον ενδιαφέρεται πραγματικά να μάθει Μας δίνει επίσης μια κοινή βάση για περαιτέρω συζήτηση σε νέες απορίες, χωρίς να χρειάζεται να επανερχομαστε σε ήδη αναλυμένα και "εξηγημένα" πράγματα. ΥΓ. Έχει προβλήματα ακόμα η αναβάθμιση του φόρουμ (σε μένα π.χ. κολλάει το ajax submit... δεν κάνει αυτόματα refresh μετά από απευθείας απάντηση/παράθεση, αλλά κάνει κανονικά μετά από επεξεργασία). Επεξ/σία 27 Ιουλίου 2012 από migf1
Star_Light Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 (επεξεργασμένο) Kοιτα ως προς τις ερωτησεις που λες... δηλαδη να επανελθει καποιος με μια δευτερη χωρις να έχει ψαχθει αρκετα στην πρωτη αυτο ειναι χαζομαρα. Απο το 6μηνο και μετα ενασχολησης του με τη γλωσσα.... οχι πιο πριν Τωρα αυτο που λες με το αρθρο.... δεν ειναι απολυτο. Γιατι δεν υπαρχει μονο ενας τροπος να μαθει καποιος. Εμενα με ενδιαφερει και η συζητηση απο το να διαβαζω μονο αρθρα.... αλλωστε δεν θα ποσταριζα καθολου εδω. Δεν θα ειχα καμια σχεση με φορα κτλπ..... Το αρθρο σου δεν το σνομπαρισα οπως λάθος νομιζεις αλλα Προς το παρον θα μεινω μεχρι εκεινα που ειπε ο ημιθεος χωρις να προχωρησω πιο βαθεια γιατι δεν έχουμε και τον άπλετο χρόνο να γινουμε Tony Hoare . Μου ζητησανε κάτι πραγματα εκτος C και πρεπει να ψαχθω και πανω σε αυτα..... :/ υ.γ Η printf γενικα θα στρογγυλοποιήσει κάτι αν ειναι ηδη με περισσοτερα ψηφια απο την οδηγια που θα της δωσεις... πχ > #include <stdio.h> int main() { double x = 0.129; printf(" %.2f " , x); return 0; } Eπομενως η λειτουργια της printf δεν έχει καμια σχεση με τον τροπο που απεικονιζονται εσωτερικα οι floating point numbers... χωρις πολλα - πολλα... μια προταση , μαζεμένη και κοφτή αυτο που εψαχνα ακριβως! Επεξ/σία 27 Ιουλίου 2012 από Star_Light
imitheos Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 υ.γ Η printf γενικα θα στρογγυλοποιήσει κάτι αν ειναι ηδη με περισσοτερα ψηφια απο την οδηγια που θα της δωσεις... πχ Eπομενως η λειτουργια της printf δεν έχει καμια σχεση με τον τροπο που απεικονιζονται εσωτερικα οι floating point numbers... χωρις πολλα - πολλα... μια προταση , μαζεμένη και κοφτή αυτο που εψαχνα ακριβως! Χαίρομαι που το ξεκαθάρισες. Δεν μπορώ όμως να μην σχολιάσω ότι το ωραίο και μαζεμένο συμπέρασμα σου αν μεταφραστεί στα αγγλικά είναι αυτό που λέει και η manpage του printf που παράθεσα. Όσο και αν πολλοί σνομπάρουν τις manpage, έχουν πολύ καλές πληροφορίες και καλό είναι να τις διαβάζουμε.
migf1 Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 ... Eπομενως η λειτουργια της printf δεν έχει καμια σχεση με τον τροπο που απεικονιζονται εσωτερικα οι floating point numbers... Ακριβώς για αυτό σου απάντησα σε προηγούμενο ποστ πως δεν έχεις καταλάβει ακριβώς τα αίτια του προβλήματος με την ακρίβεια των πραγματικών. χωρις πολλα - πολλα... μια προταση , μαζεμένη και κοφτή αυτο που εψαχνα ακριβως! Το "χωρίς πολλά πολλά" (καλώς ή κακώς) είναι επιζήμιο ως τρόπος σκέψης εκμάθησης, ειδικά στην C που μπορεί και κατεβαίνει πολύ χαμηλά ως γλώσσα (low level). Διότι συνήθως στο τέλος τα πολλά "χωρίς πολλά πολλά" μαζεύονται σε ένα πολύ μεγάλο "σχεδόν τίποτα"
Star_Light Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 Να ρωτησω κατι???? Ποιος εγγυαται οτι τελικα η puts ειναι πιο γρηγορη απο την printf? :-S
Directx Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 (επεξεργασμένο) Να ρωτησω κατι???? Ποιος εγγυαται οτι τελικα η puts ειναι πιο γρηγορη απο την printf? :-S Ποίος το λέει δεν ξέρω, απλά με την λογική λέμε ότι επειδή δεν χρειάζεται να σκανάρει το string για format specifiers κλπ. όπως η printf, ίσως υπάρχει κάποιο κέρδος στην ταχύτητα (τώρα πόσο σημαντικό θα είναι αυτό, ειδικά στα σύγχρονα συστήματα είναι μια άλλη ιστορία..) Επεξ/σία 27 Ιουλίου 2012 από Directx
Star_Light Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 Δινει εναν κωδικα στο stackoverflow ο τελευταιος που ποσταρε και βγαζει συμπερασμα λεει οτι η printf ειναι γρηγοροτερη... http://stackoverflow.com/questions/2454474/what-is-the-difference-between-printf-and-puts-in-c εμενα μου τις εχει βγαλει και ισες παντως οπως και την puts να ειναι γρηγοροτερη.
imitheos Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 (επεξεργασμένο) Να ρωτησω κατι???? Ποιος εγγυαται οτι τελικα η puts ειναι πιο γρηγορη απο την printf? :-S Ποίος το λέει δεν ξέρω, απλά με την λογική λέμε ότι επειδή δεν χρειάζεται να σκανάρει το string για format specifiers κλπ. όπως η printf, ίσως υπάρχει κάποιο κέρδος στην ταχύτητα (τώρα πόσο σημαντικό θα είναι αυτό, ειδικά στα σύγχρονα συστήματα είναι μια άλλη ιστορία..) Όπως είπε και ο DirectX, η printf τρέχει τις va_ εντολές που είναι αργές και σκανάρει το format οπότε θεωρητικά είναι πιο αργή. Πρακτικά όμως κανείς δεν εγγυάται τίποτα. Ένας compiler που σέβεται τον εαυτό του θα ελέγξει αν περάσαμε κάποιο literal στην printf και θα την αντικαταστήσει με puts ή κάτι πιο γρήγορο. Άσε που ακόμη και να μη το κάνει, τι μας νοιάζει ? Εκτός από την περίπτωση που το πρόγραμμά σου είναι απλά ένας βρόχος που τυπώνει κάτι συνέχεια, πόσο % του κώδικα σου θα είναι καλέσματα printf ? Δινει εναν κωδικα στο stackoverflow ο τελευταιος που ποσταρε και βγαζει συμπερασμα λεει οτι η printf ειναι γρηγοροτερη... http://stackoverflow...f-and-puts-in-c εμενα μου τις εχει βγαλει και ισες παντως οπως και την puts να ειναι γρηγοροτερη. > puts("Hello World"); printf("Hello World\n"); printf("%s\n", "Hello World"); Και στα 3 από τα παραπάνω (ακόμη και στο 3ο που έχει format specifier), ο gcc παράγει ακριβώς την ίδια assembly χρησιμοποιώντας παντού την puts. (Premature Optimisation)2 = all evil. Γράψε κώδικα και άσε το optimisation στον compiler Επεξ/σία 27 Ιουλίου 2012 από imitheos
Directx Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 (επεξεργασμένο) [..]> puts("Hello World"); printf("Hello World\n"); printf("%s\n", "Hello World"); Και στα 3 από τα παραπάνω (ακόμη και στο 3ο που έχει format specifier), ο gcc παράγει ακριβώς την ίδια assembly χρησιμοποιώντας παντού την puts. Μπράβο στον GCC, για την ιστορία ο C++ Builder ξεχωρίζει αυστηρά μεταξύ puts & printf οπότε ανακατευθύνει τον κώδικα σε διαφορετικές εσωτερικές ρουτίνες (ακόμα και όταν δεν χρειάζεται :-/) με εκείνη της printf να οδηγεί σε CALL υπό ρουτίνας με πολύ περισσότερο κώδικα (& κύκλους εκτέλεσης) από εκείνον της puts (προφανώς ο κώδικας σκαναρίσματος του printf input). Επεξ/σία 27 Ιουλίου 2012 από Directx
Star_Light Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 (επεξεργασμένο) Χαίρομαι που το ξεκαθάρισες. Δεν μπορώ όμως να μην σχολιάσω ότι το ωραίο και μαζεμένο συμπέρασμα σου αν μεταφραστεί στα αγγλικά είναι αυτό που λέει και η manpage του printf που παράθεσα. Όσο και αν πολλοί σνομπάρουν τις manpage, έχουν πολύ καλές πληροφορίες και καλό είναι να τις διαβάζουμε. Ευχαριστω ρε συ... αλλα μηπως σου ξέφυγε ενα λαθάκι στους υπολογισμους? εμενα μου βγαθινει ως εξης... αρχικα χωριζω και εγω σε προσημο , εκθετη και μαντισα συμφωνα με το προτυπο . Οποτε η δυαδικη αναπαρασταση του μαντισα σε κανονικοποιημενη μορφη θα ειναι 1. 00001010001111010111000 επειδη ομως ο εκθετης βγαινει -3 θα πάει τρεις θεσεις αριστερα... 0.00100001010001111010111000 και αμα το μετατρεψουμε σε δεκαδικο δινει.... 0.1299999952316284. Εσυ γράφεις 0.129999995232... εκτος και αν μου εχει ξεφυγει κανα μηδενικο ή κανα ασσάκι... τελοςπαντων http://www.digitconvert.com/ EDIT : Έχεις κατι μικρολαθάκια στους υπολογισμους.... Ειναι 0.125 * 1.039999996185302734375 = 0.129999995231 | 62841796875 εκει που εβαλα το | μεχρι εκει ηταν ο δικος σου αριθμος . Επεξ/σία 27 Ιουλίου 2012 από Star_Light
imitheos Δημοσ. 27 Ιουλίου 2012 Δημοσ. 27 Ιουλίου 2012 EDIT : Έχεις κατι μικρολαθάκια στους υπολογισμους.... Ειναι 0.125 * 1.039999996185302734375 = 0.129999995231 | 62841796875 εκει που εβαλα το | μεχρι εκει ηταν ο δικος σου αριθμος . Με την ίδια εξίσωση που έδωσα στο προηγούμενο μήνυμα, η python μου δίνει αποτέλεσμα 1.0399999618530273 και αν πολλαπλασιαστεί με 0.125 παίρνουμε 0.12999999523162842 οπότε έχει όντως καλύτερη ακρίβεια από ό,τι έδωσα. Κάποια βλακεία θα έγινε με το kcalc που χρησιμοποίησα. Όπως και να χει πάντως, το νόημα του μηνύματος μου ήταν ότι ο αριθμός είναι ένας και απλά η printf στον κόβει εκεί που θέλεις.
migf1 Δημοσ. 28 Ιουλίου 2012 Δημοσ. 28 Ιουλίου 2012 Δινει εναν κωδικα στο stackoverflow ο τελευταιος που ποσταρε και βγαζει συμπερασμα λεει οτι η printf ειναι γρηγοροτερη... http://stackoverflow...f-and-puts-in-c εμενα μου τις εχει βγαλει και ισες παντως οπως και την puts να ειναι γρηγοροτερη. Βασικά η είσοδος και η έξοδος δεν είναι αξιόπιστα μετρήσιμες, για αυτό και εξαιρούνται ή θεωρούνται σταθερές π.χ. σε υπολογισμούς big O notation. Τωρα, το γιατί κατά κανόνα η puts() είναι ταχύτερη από την printf() το εξήγησαν ήδη τα παιδιά παραπάνω, αλλά έχω ένσταση ως προς τη μη χρήση της puts() λόγω premature optimization. Όταν θέλουμε ο κώδικάς μας να είναι cross-platform και άρα δεν ξέρουμε σε ποιους compilers θα γίνει compiled, χρησιμοποιώντας την puts() όπου έχουμε επιλέξει εμείς, είμαστε κατά κανόνα σίγουρα πως δεν υπάρχει περίπτωση να είναι αργότερη από την printf(), ενώ το αντίθετο δεν ισχύει. Ήδη έδωσε τέτοιο παράδειγμα ο DirectX με τον C++ Builder ( όπου η printf() δεν μετατρέπεται σε puts() ). Δεν έχω πρόσβαση στον C++ Builder, αλλά δεν έχω κανέναν λόγο να μην εμπιστευτώ τον DirectX (το αντίθετο μάλιστα )
Star_Light Δημοσ. 28 Ιουλίου 2012 Δημοσ. 28 Ιουλίου 2012 (επεξεργασμένο) Κοιτα εσυ εχεις πει οτι η I/O processing ειναι η πιο χρονοβορα.... τωρα μου την βγαζεις απλα αναξιοπιστη? ή το ιδιο εννοεις και παλι? Επεξ/σία 28 Ιουλίου 2012 από Star_Light
imitheos Δημοσ. 28 Ιουλίου 2012 Δημοσ. 28 Ιουλίου 2012 Βασικά η είσοδος και η έξοδος δεν είναι αξιόπιστα μετρήσιμες, για αυτό και εξαιρούνται ή θεωρούνται σταθερές π.χ. σε υπολογισμούς big O notation. Τωρα, το γιατί κατά κανόνα η puts() είναι ταχύτερη από την printf() το εξήγησαν ήδη τα παιδιά παραπάνω, αλλά έχω ένσταση ως προς τη μη χρήση της puts() λόγω premature optimization. Όταν θέλουμε ο κώδικάς μας να είναι cross-platform και άρα δεν ξέρουμε σε ποιους compilers θα γίνει compiled, χρησιμοποιώντας την puts() όπου έχουμε επιλέξει εμείς, είμαστε κατά κανόνα σίγουρα πως δεν υπάρχει περίπτωση να είναι αργότερη από την printf(), ενώ το αντίθετο δεν ισχύει. Συμφωνώ και διαφωνώ ταυτόχρονα Αφενώς συμφωνώ ότι εφόσον η puts είναι σε όλους τους compilers γρήγορη γιατί να μη την χρησιμοποιήσεις, αφετέρου όμως επιμένω σε αυτό που είπα πριν. Τι ποσοστό του κώδικά σου είναι καλέσματα printf ? Επίσης έχω δει κάμποσα git commits να αλλάζουν puts σε printf γιατί σε κάποιο σημείο από απλό literal χρεάστηκαν να εμφανίσουν και κάποια μεταβλητή. Γενικά πάντως δεν νομίζω ότι είναι τόσο σημαντικό θέμα για να ασχοληθούμε με το τι από τα δύο είναι καλύτερο να βάζουμε Ήδη έδωσε τέτοιο παράδειγμα ο DirectX με τον C++ Builder ( όπου η printf() δεν μετατρέπεται σε puts() ). Δεν έχω πρόσβαση στον C++ Builder, αλλά δεν έχω κανέναν λόγο να μην εμπιστευτώ τον DirectX (το αντίθετο μάλιστα ) Θα έλεγα τι γνώμη έχω για τον C++ Builder αλλά επιφυλάσσομαι μια και έχω χρόνια να τον χρησιμοποιήσω και σε συνδυασμό με το γεγονός ότι τον χρησιμοποιεί ο DirectX τον οποίο εκτιμώ, ίσως να έχει βελτιωθεί. Κοιτα εσυ εχεις πει οτι η I/O processing ειναι η πιο χρονοβορα.... τωρα μου την βγαζεις απλα αναξιοπιστη? ή το ιδιο εννοεις και παλι? I/O πάντα είναι από τις πλέον χρονοβόρες διαδικασίες και αυτές με το χειρότερο έλεγχο από το λειτουργικό.
Directx Δημοσ. 28 Ιουλίου 2012 Δημοσ. 28 Ιουλίου 2012 (επεξεργασμένο) [..]Θα έλεγα τι γνώμη έχω για τον C++ Builder αλλά επιφυλάσσομαι μια και έχω χρόνια να τον χρησιμοποιήσω και σε συνδυασμό με το γεγονός ότι τον χρησιμοποιεί ο DirectX τον οποίο εκτιμώ, ίσως να έχει βελτιωθεί[..] Φίλε imitheos σε ευχαριστώ πολύ για τα καλά σου λόγια (όπως και τον φίλο migf1) η εκτίμηση είναι αμοιβαία προς αμφότερους Οι τελευταίες εκδόσεις του C++ Builder σε σχέση πάντα με την έκδοση 6 του 2002 η οποία υπήρξε μέχρι το 2006 η μοναδική διαθέσιμη (το εργαλείο το είχε αφήσει στην τύχη του η τότε Borland) έχει παρουσιάσει θεαματική βελτίωση τόσο όσον αφορά την πιστή εφαρμογή των στάνταρτ όσο και σε θέματα απόδοσης - ταχύτητας (βλ. FastMM ή αναθεώρηση των εσωτερικών ρουτινών διαχείρισης μνήμης προς το ταχύτερο). Στο πρώτο (στάνταρτ) θέλει δουλειά ακόμη, στο δεύτερο (απόδοση - ταχύτητα) σε σχέση με τον άμεσο ανταγωνιστή του που είναι η VC++ στέκεται αξιοπρεπώς. Το πιο ισχυρό όμως ατού του εργαλείου (μεταξύ μας) είναι η *δυνατότητα εύκολου & φιλικού native οπτικού προγραμματισμού σε C/C++ πράγμα που το καθιστά αναντικατάστατο.. Για να προλάβω τυχόν ενστάσεις από φίλους της Qt - σαφέστατα η Qt είναι πανίσχυρη, ιδιαίτερα σοφιστικέ κλπ αλλά κοστίζει όσο να' νε σε πολυπλοκότητα. Επεξ/σία 28 Ιουλίου 2012 από Directx
Προτεινόμενες αναρτήσεις