Διαδρομές
/
Rust
Rust
/
Ύλη
/
Αριθμοί κινητής υποδιαστολής
Αρ

Αριθμοί κινητής υποδιαστολής σε Rust

1 άσκηση

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

Οι αριθμοί κινητής υποδιαστολής είναι πραγματικοί αριθμοί: μπορεί να έχουν κλασματικό μέρος. Αναπαρίστανται στη μηχανή ως ένα μοτίβο δυαδικών bit, χρησιμοποιώντας την προδιαγραφή IEEE-754. Οι άνθρωποι αναφέρονται στους αριθμούς κινητής υποδιαστολής ως floats.

Οι αριθμοί κινητής υποδιαστολής είναι πάντα προσημασμένοι. Η προσημασία σημαίνει ότι δεσμεύεται ένα από τα bit του αριθμού για να δηλώσει αν ο αριθμός είναι αρνητικός ή όχι.

Οι αριθμοί κινητής υποδιαστολής έχουν ένα πλάτος bit, που είναι απλώς ο αριθμός των bit που αποτελούν τον αριθμό. Αυτό επηρεάζει το εύρος και την ακρίβεια των τιμών που μπορεί να αναπαραστήσει αυτός ο τύπος.

Η Rust έχει 2 πρωταρχικούς τύπους κινητής υποδιαστολής: f32 και f64. Ο αριθμός μετά το f δηλώνει το πλάτος bit. Σε άλλες γλώσσες, το f32 αναφέρεται μερικές φορές ως "single-precision" και το f64 ως "double-precision".

Ποιο να χρησιμοποιήσω;

Γενικά, χρησιμοποίησε f64: είναι το ίδιο γρήγορο με το f32 στο περισσότερο σύγχρονο καταναλωτικό hardware, και μειώνει σημαντικά τη συχνότητα εμφάνισης της ανακρίβειας κινητής υποδιαστολής.

Αν χρειάζεσαι ρητούς αριθμούς άπειρης ακρίβειας, μπορείς να χρησιμοποιήσεις το crate num-rational, το οποίο παρέχει έναν τύπο BigRational. Αν χρειάζεσαι δεκαδικούς αριθμούς σταθερής ακρίβειας, μπορείς να χρησιμοποιήσεις το crate rust_decimal, το οποίο παρέχει έναν τύπο Decimal.

Μετατροπή μεταξύ αριθμών κινητής υποδιαστολής

Η Rust δεν έχει έμμεσες αριθμητικές μετατροπές. Αν χρειάζεται να κάνεις cast μεταξύ τύπων float, υπάρχουν δύο βασικές στρατηγικές: η λέξη-κλειδί as, και τα traits From και TryFrom.

Η χρήση της λέξης-κλειδιού as είναι απλή: expr as Type. Ωστόσο, υπάρχουν αρκετές ιδιαιτερότητες και λεπτομέρειες που πρέπει να έχεις κατά νου όταν χρησιμοποιείς cast με as.

Το cast μέσω traits είναι λίγο πιο σύνθετο, αλλά ασφαλέστερο: τα traits μετατροπής υλοποιούνται μόνο εκεί που είναι ασφαλή. Για παράδειγμα, το f32 υλοποιεί τα From<u8>, From<u16>, From<i8> και From<i16>: κάθε τιμή που μπορεί να αναπαρασταθεί από οποιονδήποτε από αυτούς τους τύπους είναι εγγυημένο ότι μπορεί να αναπαρασταθεί και σε ένα f32. Μπορεί να χρησιμοποιηθεί όπως το f32::from(expr), ή το expr.into(), όπου το expr αντιστοιχεί σε έναν από αυτούς τους τύπους.

Όταν μετατρέπεις τιμές κινητής υποδιαστολής, το cast με as προτιμάται συχνά, απλώς και μόνο λόγω της σχετικής σπανιότητας των υλοποιήσεων cast μέσω traits. Από τον Οκτώβριο του 2020, το TryFrom δεν έχει υλοποιηθεί για αριθμούς κινητής υποδιαστολής. Το cast με as από f32 σε f64 είναι χωρίς απώλεια. Το αντίστροφο έχει απώλεια, αλλά διαθέτει ένα καθορισμένο πρωτόκολλο cast που στοχεύει στην ελαχιστοποίηση της απώλειας.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα