PDA

Επιστροφή στο Forum : float 32bit τι αριθμός είναι ?



DT200
16-07-08, 13:15
έχω μπερδευτεί..
γράφω προγράμματα σε MikroBasic και σε
κάποια φάση που δίνει επεξηγήσεις για διάφορους καταχωρητές
έχει και αυτό και δεν μπορώ να καταλάβω ποιος αριθμός είναι
δηλαδή, είναι 6 δισεκατομμύρια και κάτι ψιλά ? ή όχι , τι είναι...?

αν υποθέσουμε ότι είναι απλά 32bit τότε το μέγιστο θα ήταν 2^32=4.294.967.296

chip
16-07-08, 13:51
Είναι αριθμός με κινητή υποδιαστολή (float) δηλαδή κάνει πράξεις όπως κάνουν τα κομπιουτεράκια και τα PC (ο υπολογιστής spectrum (δεκαετία 80) είχε ακριβώς αυτή την αναπαράσταση αριθμών) , και πέρνει τιμές στο διαστημα που δείχνει (-1,17 χ10 υψωμένο στην 38 έως την αντίστοιχη θετική τιμή) ουσιαστικά κάνει μετατροπή σε δυαδίκό σύστημα και το αναπαραριστά με ένα αριθμό που έχει 24 bit για mantisa (το "δεκαδικό" μέρος η πιο σωστά ο συντελεστής αφού ο αριθμός δεν είναι δεκαδικός πλέον) 7 bit για exponent (εκθέτης) και 1 bit προσήμου. Αυτός είναι ο λόγος που φαίνεται περίεργο το νούμερο. Ο παραπάνω τρόπος απεικόνισης αριθμών περιγράφεται από το standar IEEE754. Αφού γίνουν οι πράξεισ θα επιστρέψει δεκαδικό. (υποθέτω οτι ο compiller που χρησιμοποιείς κάνει ο ίδιος την μετατροπή από και προς δεκαδικο σε δυαδικό και δεν θέλει να υπολογίσεις εσύ το Mantisa και το exponent)

DT200
16-07-08, 14:02
ναι αλλά έτσι όπως το καταλαβαίνω εγώ το 1,17χ10^38 είναι ένας αριθμός
με 38 μηδενικά , δηλαδή 117.000.000.000.000.000.000.000.000.000.000.000.00 0
117 δεκάκις εκατομμύρια !!! κάπου κάνω λάθος

JIMKAF
16-07-08, 14:14
Float στη συγκεκριμένη περίπτωση πρέπει να σημαίνει διακύμανση γι' αυτό σου έχει και το ± .

chip
17-07-08, 09:46
Σωστά κατάλαβες, μπορεί να δείξει πολύ μεγάλους αριθμούς. Για να κάνεις απλές πράξεις είναι όντως υπεραρκετό το 10^38 αν όμως ήθελες να κάνεις επιστημονικές πράξεις μπορεί και να μην ήταν αν και το μεγαλύτερο πρόβλημα είναι οτι δεν σου δίνει πολλά δεκαδικά ψηφία (5-6 νομίζω). Για το λόγω αυτό, στον προγραμματισμό στα pc, σε προγράμματα προσσωμοίωσης βάζουν double float (64bit).
Το float είναι σαφές και αναφέρεται σε μέθοδο που χρησιμοποιεί κινητή υποδιαστολή. Δηλαδή χρησιμοποιεί τη σήμανση, συντελεστής επί εκθετικό και το κάνει γιατί διαφορετικά θα έπρεπε να είχε παρα πολλά ψηφία μπροστά και πίσω από την υποδιαστολή. Αντίθετα, έτσι έχει πάντα συγκερκιμένο αριθμό ψηφίων και μετακινεί την υποδιαστολή. Βέβαια χάνει σε ακρίβεια γιατί όταν δείχνει μεγάλο αριθμό δεν θα δείξει πολλά ψηφία (πράγμα που το λαμβάνει κανείς υπόψη του...)
Αν τώρα σκεφτεσαι να το βάζεις σε όλα τα προγράμματα το κόστος θα είναι σε μνήμη flash και RAM και φυσικά στην ΜΕΙΩΜΕΝΗ ταχύτητα που εκτελείται το πρόγραμμα!!!

chip
17-07-08, 09:47
όπου αναφέρω μεγάλους αριθμους αναφερομε κατ απόλυτη τιμή δηλαδή και σε + και σε -

savnik
17-07-08, 10:33
Να αποφεύγεις το float όσο μπορείς γιατί σου τρώει πάρα πολύ μνήμη όπως είπε και ο chip.

DT200
17-07-08, 12:50
επειδή είμαι πολύ δύσπιστος στο ότι μπορεί να πιάσει τόσο μεγάλους αριθμούς
θα φτιάξω ένα προγραμματάκι για να το επιβεβαιώσω.

DT200
17-07-08, 16:36
το αποτέλεσμα του τεστ που έκανα είναι το έξεις:
έφτιαξα μία ρουτίνα που μπορούσα να προσθέτω στον
αριθμό Float τους αριθμούς 1,10,100,1.000,10.000,100.000,1.000.000
και μπορούσε να φτιάξω όποιον αριθμό ήθελα.
το αποτέλεσμα στην οθόνη ήταν ένας ακέραιος αριθμός με 5 ψηφία μετά την υποδιαστολή .
όλα πήγαιναν καλά μέχρι τον αριθμό 16.777.216 από εκεί και πέρα δεν πρόσθετε τον αριθμό 1
και πρόσθετε όλους τους άλλους , αργότερα δεν πρόσθετε το 10, μετά το 100 και μετά ...

μετά τον αριθμό 1δις τρελάθηκε, στα μπροστινά νούμερα με την μεγαλύτερη αξία έκανε κανονικά
πρόσθεση και στα χαμηλά αφαίρεση.
ο μεγαλύτερος αριθμός που έπιασε πριν περάσει στους αρνητικούς ήταν 2,2 δις και κάτι ψιλά

το πόρισμα δικό σας ...

chip
17-07-08, 18:13
Ή έχει Bugg o compiler σου ή κάποιο λάθος έκανες και τρελάθηκε. Έπρεπε να φτάσει το 10 υψωμένο στην 38. Όσο για το οτι έτρωγε το 1 μετά το 10... είναι απόλύτως φυσιολογικό αφού όπως είπα ο τρόπος αυτός τρώει τα μικρότερα ψηφία όσο μεγαλώνει ο αριθμός αφού ο συντελεστής έχει συγκεκριμένο αριθμό ψηφίων μετά την υποδιαστολή. Να σαι σίγουρος οτι και τα PC έτσι κάνουν σε Standar προγράμματα... όταν η ακρίβεια είναι ρυθμισμένη σε float 32. Φυσικά η λύση στα PC είναι να πας σε douple float οπότε ναι μεν η φιλοσοφία είναι η ίδια αλλά το σφάλμα πολύ μικρότερο.
(Το 16777216 προκύπτει από το μεγαλύτερο ψηφίο που μπορεί να κρατήσει το Mantisa των 32 bit που είναι 24bit.)

chip
17-07-08, 18:14
Το 16777216 προκύπτει από το μεγαλύτερο ψηφίο που μπορεί να κρατήσει το Mantisa των 32 bit που είναι 24bit.)

ήθελα να πώ τον μεγαλύτερο αριθμό (όχι ψηφίο)

DT200
18-07-08, 00:58
για εμένα αφού ο αριθμός έχει μήκος 32Bit και έχει θετικούς και αρνητικούς
τότε δεν μπορεί με τίποτα να ξεπεράσει το 2^32=4.294.967.296 και αυτό στην μέση
για να έχει +και - άρα 2.147.483.648, όπως ο καταχωρητής longint αλλά δεν
πιάνει αυτές τις τιμές διότι έχει και την κωδικοποίηση της υποδιαστολής .

για να επιβεβαιώσω ότι το πρόγραμμα μου είναι σωστό το έτρεξα με longint και με longword
και όλα έχουν καλός .

chip
18-07-08, 09:34
Αυτό που σου είπα είναι κάτι STANDARD, που δεν χωράει αμφισβήτηση μπορείς να το βρείς σε χιλιάδες βιβλία Ελληνικά και Ξένα σε application note και διδάσκεται λίγο πολύ παντου. Είναι ο τρόπος σήμανσης IEEE754 όπως είπα, αν θες κάνε μια αναζήτηση στο wikipedia και θα το διαπιστώσεις και μόνος σου. Αυτό που αναφέρεις (2^32=4.294.967.296) είναι το integer 32bit, που δεν μπορεί να έχει δεκαδικά αντίθετα το float 32 bit είναι αυτό που σε περιέγραψα.

DT200
18-07-08, 11:21
δεσμεύομαι να το ψάξω κι'άλλο .
κάτι μου λέει ότι έχουμε και οι δύο δίκιο αλλά δεν το βρίσκουμε :evil: