Προς το περιεχόμενο

floating point numbers


Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας. Για την μεταγλώτιση των προγραμμάτων μου σε C, χρησιμοποιώ τον gcc σε linux system. Πώς μπορώ να δώ, στην υπάρχουσα έκδοση που εχω εγκαταστήσει (4.4.4), πόσα bit αναπαραστασης είναι ο κάθε τύπος των floating point numbers (float, double , long double)? Λόγω, της αριθμητικής ακρίβειας που απαιτούν οι εφαρμογές μου θέλω να γνωρίζω αν όντως ο long double είναι 80 bit η παραπανω.

 

Ευχαριστώ

 

Κώστας

Δημοσ.

Γεια σας. Για την μεταγλώτιση των προγραμμάτων μου σε C, χρησιμοποιώ τον gcc σε linux system. Πώς μπορώ να δώ, στην υπάρχουσα έκδοση που εχω εγκαταστήσει (4.4.4), πόσα bit αναπαραστασης είναι ο κάθε τύπος των floating point numbers (float, double , long double)? Λόγω, της αριθμητικής ακρίβειας που απαιτούν οι εφαρμογές μου θέλω να γνωρίζω αν όντως ο long double είναι 80 bit η παραπανω.

 

Ευχαριστώ

 

Κώστας

 

>
printf( "%zu\n", sizeof( float ) * 8 );
// κλπ 

Δημοσ.

Ο %z είναι μόνο για integer types και λέει στην printf να περιμένει τιμή που επιστρέφεται από sizeof() ... o %u είναι ο κλασσικός για unsigned.

Δημοσ.

Ο %z είναι μόνο για integer types και λέει στην printf να περιμένει τιμή που επιστρέφεται από sizeof() ... o %u είναι ο κλασσικός για unsigned.

 

Και γω πρώτη φορά βλέπω τον %z, αλλά τι νόημα έχει το u αν το z είναι για τιμές από sizeof() που είναι πάντα unsigned?

Δημοσ.

Και γω πρώτη φορά βλέπω τον %z, αλλά τι νόημα έχει το u αν το z είναι για τιμές από sizeof() που είναι πάντα unsigned?

 

Επειδή ο size_t τύπος επιστροφής της sizeof() είναι implementation defined. Το %z είναι portable length specifier.

 

EDIT:

 

Να το εξηγήσω λίγο περισσότερο για όσους δεν είναι εξοικειωμένοι με τη γλώσσα...

 

Γράφοντας...

 

>
printf("%u", sizeof( something) );
printf("%lu", sizeof( something) );
printf("%llu", sizeof( something) );

μόνο το ένα θα περάσει το compilation χωρίς warning.

 

Γράφοντας...

 

>
printf("%zu", sizeof( something) );

είναι ο portable τρόπος να τυπώνουμε τύπους size_t με όλους τους compilers.

Δημοσ.

Επειδή ο size_t τύπος επιστροφής της sizeof() είναι implementation defined. Το %z είναι portable length specifier.

 

Λοιπόν στο ενδιάμεσο το έψαξα γιατί με έτρωγε... :rolleyes:

 

Το σωστό θεωρητικά είναι όντως %zu. Απο κει και πέρα, στην πράξη φαντάζομαι ότι διαφορά μπορεί να προκύψει μόνο αν κάνεις compile σε little endian σύστημα όπου ο int είναι 32 bit ενώ ο size_t είναι 64, στην οποία περίπτωση θα εμφανιστεί η λανθασμένη τιμή μηδέν. Εφόσον ο caller καθαρίζει το stack πάντα στην printf δε βλέπω δυνατότητα για να γίνει κάτι άλλο στραβό αν βάλεις %d αντί για %z.

 

Απο κει και πέρα το %u αν και σωστό μου φαίνεται πως δέν κάνει κάτι γιατί θα έπρεπε να μιλάμε για τουλάχιστον 2GiB μέγεθος του type μέχρι να φτάσει να μπορεί να το δει κανείς σαν αρνητικό (που στην πράξη αποκλείεται).

 

EDIT: Φυσικά (duh) δεν είναι legal να γράψεις σκέτο %z γιατί το z είναι length specifier και χρειάζεται οπωσδήποτε και type specifier (όπως το u).

 

Επίσης είναι documented στο ISO9899-1990, παρ. 6.3.3.4 ότι ο size_t είναι unsigned, επομένως θα μπορούσε η printf να πάρει το %u σαν δεδομένο όταν δει %z:

 

The value of the result is implementation-defined and its type (an unsigned integral type) is size_t...

 

Ευχαριστώ για το έναυσμα! :-D

Δημοσ.

Είχα κάνει edit την ώρα που έγραφες, δοκίμασε το σε διάφορους compilers. Δοκίμασε και με %d αντί για %u... χωρίς z μπροστά θα έχεις warnings, με z δεν θα έχεις.

Δημοσ.

Είχα κάνει edit την ώρα που έγραφες, δοκίμασε το σε διάφορους compilers. Δοκίμασε και με %d αντί για %u... χωρίς z μπροστά θα έχεις warnings, με z δεν θα έχεις.

 

Ναι λογικό είναι να έχω warnings, δεν έχω αντίρρηση σ' αυτά που λες -- απλά περιέργεια.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...