PDA

Επιστροφή στο Forum : Float μεταβλητές σε GCC



Thansavv
03-08-10, 23:07
Καλησπέρα σας,
Λοιπόν, θέλω μια βοήθεια σχετικά με C. (GCC)

Μεταξύ άλλων δηλώνω:


float c;
int a=10;
int b=3;

c=b/a;

και το c μου το βγάζει 0. Τι παίζει και δεν παίζει? :blush:

georgz
03-08-10, 23:20
Στο βγάζει 0 επειδή δεν σου δείχνει το δεκαδικό μέρος. Δοκίμασε να το κάνεις double.

georgz
03-08-10, 23:27
Δοκίμασες αυτήν την εντολή??? Πως το εμφανίζεις??

printf("%f\n",c);

Thansavv
03-08-10, 23:34
Ευχαριστώ Γιώργο. Είναι σε GCC στο AVRstudio. Βρήκα μετά από ψάξιμο στο ιντερνετ ότι πρέπει να γράψω


c=(float)b/a;

και μου δούλεψε. Κάτι έμαθα και σήμερα :))

tasosmos
04-08-10, 00:24
Αυτο ειναι ενα απο τα κλασικα "προβληματα" που εχει η C.

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

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

Ισοδυναμο με το (float)b/a ειναι το b./a Ειναι το γνωστο casting μεταβλητης, θεωρει προσωρινα ο compiler την b σαν float και κανει την πραξη σε float "mode".

Thansavv
04-08-10, 00:31
Ευχαριστώ Τάσο.


logos=(float)absy/absx; Αυτό μου παίζει

logos=absy./absx; αυτό μου βγάζει σφάλμα

tasosmos
04-08-10, 01:54
Ισως να μην το υποστηριζει ο compiler το casting με (μεταβλητη). δεν εχω χρησιμοποιησει gcc οποτε δεν μπορω να σου πω σιγουρα.

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

Δοκιμασε να βαλεις και logos=absy/absx. ; μηπως παιξει.

aeonios
04-08-10, 08:25
Επιτρέψτε μου μια παρέμβαση. Δεν είναι "πρόβλημα" της C αυτό αλλά του προγραμματιστή.
Η C καλώς έχει αυστηρό σύστημα δήλωσης μεταβλητών. Το casting δεν είναι σωστή προγραμματιστική τακτική και πρέπει να γίνεται μόνο όταν δεν μπορούμε ή δεν μας συμφέρει να διορθώσουμε τα πράγματα αλλιώς και δείχνει ότι γράφουμε κώδικα χωρίς να έχουμε κάτσει να υπολογίσουμε σωστά το τι κάνει το πρόγραμμα μας φτιάχνοντας σωστά το προσχέδιο του(ανάλυση) και δοκιμάζοντας πιθανά σενάρια πριν το υλοποιήσουμε σε οποιαδήποτε γλώσσα. Φιλικά πάντα! :)

lastid
04-08-10, 09:42
Η τελεία . έχει νόημα για σταθερές. Η σταθερά 3 είναι int ενώ η σταθερά 3. είναι float.
Συνοψίζοντας, η παράσταση a./b είναι λάθος, η παράσταση 3/2 επιστρέφει 1 ενώ η παράσταση 3./2 επιστρέφει 1.5.