Jump to content



c και printf


oxide

Recommended Posts

καλημερα.

θελω να κανω ενα προγραμματακι σε c για μετατροπη απο δεκαδικο σε binary

βασικα ομως το προβλημα μου δεν σχετιζεται αμεσα με το τι θα κανει το προγραμμα.

απλα οσον αφορα την εντολη printf δεν μπορω να την κανω να τυπωσει μεγαλους σε ψηφια αριθμους....

στη καλυτερη μου κοβει τα ψηφια.

τον αριθμο που θα δεχεται τον εχω δηλωσει σαν double

και για αρχη θελω να τον τυπωσω οσο μεγαλος και να ειναι(δεν εννοω να εχει εκατομυρια ψηφια :p ).

πως να το κανω αυτο?

ευχαριστω

Link to comment
Share on other sites

δοκίμασεις να το περάσεις σαν string? %s

σαν %f %

http://www.cplusplus.com/reference/clibrary/cstdio/printf.html

δείξε τον κώδικα σου

περιορισμό στο μέγεθος του αριθμού που μετατρέπεις τι έχεις?

http://www.c.happycodings.com/Miscellaneous/code9.html

Link to comment
Share on other sites

Αρχική απάντηση από DarkSaga

περιορισμό στο μέγεθος του αριθμού που μετατρέπεις τι έχεις?

απο το hardware?(ειπα βλακεια?)

σαν string δεν το δοκιμασα γτ ειχα την εντυπωση οτι δεν μπορω να κανω πραξεις ...κανω λαθος?

το προγραμμα στο δευτερο λινκ ειναι μονο μεχρι το 255

εμενα με ενδιαφερουν και μεγαλυτεροι αριθμοι

βεβαια ομολογω πως σαν αρχαριος στη c δεν ξερω τις εντολες

scanf και την δηλωση void οποτε απλα μπορει να μην βλεπω κατι.

τωρα το προγραμμα θα το καταφερω απλα δεν μπορω να το κανω να τυπωσει μεγαλους αριθμους μεταβλητης υποδιαστολης

Link to comment
Share on other sites

Αρχική απάντηση από oxide[/b μεγαλους αριθμους μεταβλητης υποδιαστολης

τι εννοείς?

ένα %lf ή %ld θα σου έκανε δουλειά μάλλον

τσέκαρες τη σελίδ που σου έδωσα να δεις τo l(Length)

υπέθεσα πως λύνεις άσκηση.

σου διευκρινίζει πόσο μεγάλους αριθμούς πρέπει να υποστηρίξεις?

σκέψου ότι ακόμα και το 1024 θέλει 10 νουμερα για να το εκφράσεις δυαδικά.

καινα ξέρεις πως η λύση είναι στην ήδη διδαχθείσα ύλη

αν κάτι που σου προτείνουμε δεν το έχεις συναντήθει καλύτερα να το προσπεράσεις

για να μη σε μπλέξουμε

Link to comment
Share on other sites

Επειδή το είχα κοιτάξει παλιότερα το ζήτημα είχα καταλήξει στα εξής χωρίς όμως να είμαι 100% ακριβείς γιατί δεν τα θυμάμαι... στην C όπως και στις περισσότερες γλώσσες προγραμματισμού, τα float numbers δεν "ανοίκουν" στην ίδια την γλώσσα, αλλά περιγράφονται από διεθνή πρωτόκολλα (όπως το ΙIEEE-754 ) για την Ansi C... αυτό έχει τα καλά του και τα αρνητικά του...

ο double είναι στην ουσία ένας float και ονομάζεται έτσι επειδή είναι το "double precision" του float ("single precision"), δηλαδή έχει δυο φορές ακρίβεια μεγαλύτερη από τον float... αυτό απλά σημάινει ότι είναι τα διπλά bits, δηλαδή 64-bits αντί για 32 του float... όλα αυτά τα γράφω σαν συλλογισμό που οδηγεί στα παρακάτω...

το πρωτόκολλο ναι μεν υποστηρίζει την μοντελοποίηση και στην ουσία αποθήκευση τόσο μεγάλων αριθμών, όμως δεν σημαίνει ότι και η C μπορεί να τους αναπαραστήσει... Δηλαδή, ενώ η standard lib και η μηχανή της C μπορεί να τους αποθηκεύσει σαν ΙΕΕΕ-754 double precision numbers, ωστόσο δεν μπορεί να αναπαραστήσει πάνω από 10 δεκαδικά όταν της ζητηθεί, λόγο δικού της περιορισμού... άρα αυτό είναι περιορισμός της ίδιας της C αλλά και πάλι το ίδιο το ΙΕΕΕ-754 μπορεί να σου δώσει μόνο μέχρι τόσο...: 0x7fef ffff ffff ffff ~ 1.7976931348623157 x 10^308, δηλαδή 16 δεκαδικά...

Αυτό λύνεται με κάποια τρικ στον κώδικα ένα από τα οποία είναι το εξής... έχεις τον αριθμό

x=1.7976931348623157 τον οποίο θέλεις να τον κάνεις print...

Η C βλέπει αυτό:

1.7976931348623157...

δηλαδή ενώ έχει πραγματικά αποθηκευμένο όλο τoν αριθμό μπορεί να σου τυπώσει μόνο το bold μέρος, λόγο του περιορισμού των 10-bits... οπότε εσύ φτιάχνεις ένα καινούργιο double π.χ. y και λές:

y=x*10^6 = 17976931348.623157

και τώρα η C μπορεί να το δει όλα τα δεκαδικά... δηλαδή "σμπρώχνεις" μπροστά τα ψηφία πολ/ντας επί μια δύναμη του 10...

Με τον τρόπο αυτό τα σώζεις σε ένα char[] αυτά που θες με την υποδιαστολή όπου θες και είσαι οκ...

Γενικά αυτό είναι ένα κόλπο για να τυπώνεις πολλά δεκαδικά ψηφία... το πρόβλημα είναι όμως όταν θες να κάνεις πράξεις με αυτά...

λόγο του περιορισμού της C και επειδή τα στρογγυλοποιεί, πρέπει να χρησιμοποιείς μεθόδους με πράξεις πινάκων μετασχηματισμών, όπως για παράδειγμα FFT πινάκων... μόνο με αυτό τον τρόπο μπορείς να κάνεις υπολογισμούς με τόσο μεγάλη ακρίβεια και είναι πολύ δύσκολο να υλοποιήσεις τέτοιους αλγορίθμους...

δυστυχώς δεν θα βρεις κώδικα για αυτούς... είναι επτασφράγιστα μυστικά των guru του είδους... π.χ. με FFT πολ/σμους και διαιρέσεις δουλεύει και το super pi...

Link to comment
Share on other sites

σας ευχαριστω ολους για τις απαντησεις...

@darksaga Οχι δεν λυνω ασκηση απλα επειδη μου αρεσε η c σαν γλωσσα,εκτιμισα οτι εχει παρα πολλες δυνατοτητες και ειπα να την μαθω μια ωρα αρχιτερα ,ενω θα ασχολουμε και με διαδικο συστημα λιγο πολυ το οποιο κανουμε σε αλλο μαθημα.

@defiant δεν λεω καποιο συσκεκριμενο απλα θεωρω οτι μεχρι το 255 θα ηταν πολυ περιορισμενων δυνατοτητων το προγραμματακι.

@jaco ωραιο το κολπακι πρεπει να ειχαμε πει και στη σχολη αλλα δεν το θυμομουν...

και τα υπολοιπα πολυ χρησιμα και για αργοτερα.

υγ για τους περιεργους... στο ΠΑΜΑΚ ειμαι εφαρμοσμενη

Link to comment
Share on other sites

ξέχνα την C

ξεκίνα c++

ή Java

περισσότερες δυνατότητες καλύτερη διαχείριση των πάντων και πολύ πιο οργανωμένες

αφού το κάνεις για σένα διάλεξε κάτι που είναι και πιο εφαρμόσιμο /πρακτικό

και πιο δυνατό/σωστό

Link to comment
Share on other sites

το 3ερω οτι η c++ ειναι πανισχυρη αλλα μιας και την c την κανω στη σχολη ειπα να ασχοληθω με αυτη.

το προγραμμα αυτο μπορει με μικροαλλαγες να μεταφερθει στην ++

και να εκτελειτε πχ με το πατημα ενος κουμπιου?

αυτο που θελω να πω ειναι οι εντολες ιδιες και στην ++ η μπααα..?

να φανταστω οτι εκει δεν ταλαιπωρησε με βιβλιοθηκες?????

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.