Πώς να κάνετε μαθηματικά κινητής υποδιαστολής σε σενάρια Linux Bash
Βασικά Takeaways
- Το κέλυφος του Linux Bash υποστηρίζει μόνο ακέραιους αριθμούς και δεν μπορεί να εκτελέσει υπολογισμούς σε αριθμούς κινητής υποδιαστολής.
- Το βοηθητικό πρόγραμμα bc στο Linux επιτρέπει ακριβείς υπολογισμούς κινητής υποδιαστολής διαδραστικά και σε σενάρια φλοιού.
- Χρησιμοποιώντας το bc, μπορείτε να ορίσετε τον αριθμό των δεκαδικών ψηφίων για εμφάνιση και εκτέλεση υπολογισμών με αυθαίρετη ακρίβεια, συμπεριλαμβανομένης της χρήσης συναρτήσεων από την τυπική βιβλιοθήκη μαθηματικών.
Το κέλυφος του Linux Bash υποστηρίζει μόνο ακέραιους αριθμούς. Δεν μπορεί ούτε να κατανοήσει ούτε να αντιμετωπίσει τους υπολογισμούς κινητής υποδιαστολής. Το βοηθητικό πρόγραμμα bc σάς παρέχει ακριβείς υπολογισμούς κινητής υποδιαστολής διαδραστικά και σε σενάρια φλοιού.
Γιατί το Bash υποστηρίζει μόνο ακέραιους αριθμούς
Η αρχική απόφαση σχεδιασμού για τον περιορισμό του
Unix
Κέλυφος Bourne
σε ακέραιους αριθμούς
θα μπορούσε
να έχει τις ρίζες της στην πρώιμη υπολογιστική αντιστοίχιση ενός ακέραιου αριθμού σε ένα μόνο byte μνήμης RAM. Μπορεί να μην μάθουμε ποτέ τι ήταν πραγματικά πίσω από την απόφαση. Ούτε, εν προκειμένω, γιατί η έκδοση Linux του κελύφους Bourne, το κέλυφος Bash, επέλεξε να ακολουθήσει το παράδειγμά της.
Από μόνο του, το Bash δεν μπορεί να εκτελέσει υπολογισμούς σε αριθμούς κινητής υποδιαστολής και οι υπολογισμοί σε ακέραιους αριθμούς που θα είχαν κλασματικό μέρος στην απάντηση αναφέρονται ως περικομμένες ακέραιες τιμές. Αυτό ισχύει στη γραμμή εντολών και στα σενάρια κελύφους Bash. Ανάλογα με την περίπτωση χρήσης σας, αυτό μπορεί να είναι προβληματικό ή να σταματήσει.
Το Linux διαθέτει δύο βοηθητικές εφαρμογές που σας επιτρέπουν να πραγματοποιείτε υπολογισμούς κινητής υποδιαστολής. Ένα από αυτά είναι το dc. Είναι λίγο περίεργο, λειτουργεί όπως συμβαίνει
αντίστροφη-Πολωνική σημειογραφία
. Το άλλο εργαλείο είναι π.Χ. Μπορεί να χρησιμοποιηθεί διαδραστικά ή ως εντολή και είναι η λύση που θα συζητήσουμε εδώ.
Το
πρόβλημα
Ας κάνουμε τον Bash να διαιρέσει το έξι με το τρία.
echo $((6 / 3))
Λαμβάνουμε την αναμενόμενη απάντηση των δύο. Τώρα ας διαιρέσουμε το έξι με το επτά. Προφανώς, αυτό θα έχει μια κλασματική απάντηση.
echo $((6 / 7))
Το μηδέν είναι προφανώς λάθος. Ας προσπαθήσουμε ξανά, διαιρώντας το 16 με το 7.
echo $((16 / 7))
Παίρνουμε μια απάντηση δύο. Αυτό που συμβαίνει είναι ότι το κλασματικό μέρος της απάντησης απορρίπτεται, επομένως η απάντηση περικόπτεται. Δεν υπήρχε κλασματικό μέρος στο πρώτο παράδειγμα, οπότε παίρνουμε τη σωστή απάντηση.
Το δεύτερο παράδειγμα δεν είχε ακέραιο στοιχείο στην απάντηση, μόνο ένα κλασματικό μέρος. Επειδή το κλασματικό μέρος έχει απορριφθεί, η απάντηση που φαίνεται είναι μηδέν.
Στο τρίτο παράδειγμα, το 7 διαιρείται σε 16 δύο φορές, με ένα κλασματικό υπόλοιπο.
Και
πάλι, το υπόλοιπο απορρίπτεται και το αποτέλεσμα περικόπτεται.
Διαδραστική χρήση του bc
Μπορείτε να χρησιμοποιήσετε το bc ως διαδραστική αριθμομηχανή πληκτρολογώντας bc και πατώντας το πλήκτρο «Enter».
bc
Η
εφαρμογή
bc εκκινείται, ανακοινώνει τον αριθμό της έκδοσής της και, στη συνέχεια, περιμένει την εισαγωγή σας. Πληκτρολογώντας έναν υπολογισμό και πατώντας «Enter» κάνει το bc να αξιολογήσει τον υπολογισμό και να εμφανίσει την απάντηση.
16 * 41024 / 32
2^2 * 1024
Μπορείτε να χρησιμοποιήσετε «Ctrl+L» για να καθαρίσετε την οθόνη και «Ctrl+D» για έξοδο από το πρόγραμμα. Ας δοκιμάσουμε έναν υπολογισμό που θα έχει κλασματική συνιστώσα στην απάντηση.
22 / 7
Δεν είναι αυτό που περιμέναμε. Αντιθετικά, αν και το bc μας επιτρέπει να χρησιμοποιούμε αυθαίρετη ακρίβεια, από προεπιλογή δεν θα εμφανίζει την υποδιαστολή ούτε τα ψηφία που την ακολουθούν.
Για να γίνει ορατή η αληθινή απάντηση, πρέπει να πούμε π.χ. πόσα δεκαδικά ψηφία να εμφανιστούν. Αυτό το κάνουμε με την εντολή «scale». Θα ζητήσουμε επτά δεκαδικά ψηφία και θα κάνουμε ξανά τον υπολογισμό μας.
scale=7
22 / 7
Επιτέλους, κάπου φτάνουμε. Η ρύθμιση “κλίμακα” παραμένει στη θέση της μέχρι να την αλλάξετε. Ο καθορισμός του αριθμού των δεκαδικών ψηφίων λέει bc το
ανώτατο όριο
αριθμός θέσεων προς εμφάνιση. Εάν μια απάντηση δεν χρειάζεται τόσα δεκαδικά ψηφία, εμφανίζεται με τον αριθμό των δεκαδικών ψηφίων που απαιτεί και όχι περισσότερα. Δεν γεμίζει με μηδενικά χωρίς νόημα.
scale=10
0.300003 * 0.5
Μπορείτε να παραθέσετε διαφορετικούς υπολογισμούς στην ίδια γραμμή χρησιμοποιώντας ένα ερωτηματικό “;” να τους χωρίσουν. Οι απαντήσεις εμφανίζονται σε ανά γραμμή ως συνήθως, με τη σειρά που αναφέρονται οι υπολογισμοί.
25 * 6; 12.5 + 45.001; 3 + 5 + 7 + 9
Μπορείτε επίσης να συμπεριλάβετε την εντολή “scale” στη λίστα.
scale=8; 22 / 7; scale=3; 0.3 * 0.071
The Standard Math Library
Η επιλογή -l (τυπική βιβλιοθήκη μαθηματικών) αναγκάζει το bc να φορτώσει ένα σύνολο συναρτήσεων και ορίζει την “κλίμακα” σε 20 δεκαδικά ψηφία.
bc -l
22 / 7
Με τη φόρτωση της τυπικής βιβλιοθήκης, μπορείτε να χρησιμοποιήσετε αυτές τις συναρτήσεις στους υπολογισμούς σας.
-
s (x)
: Το ημίτονο του x -
γ (x)
: Το συνημίτονο του x. -
α (x)
: Η αρκταγόνα του x -
l (x)
: Ο φυσικός λογάριθμος του x -
e (x)
: Η εκθετική του e στην τιμή x -
j (n,x)
: Η συνάρτηση Bessel της ακέραιας τάξης n του x.
Το ημίτονο, το συνημίτονο και το τόξο χρησιμοποιούν τιμές ακτινίου.
s (1.1)
c (.891207)
a (.628473)
Αποστολή εισόδου στο bc στη γραμμή εντολών
Μπορείτε να χρησιμοποιήσετε ανακατεύθυνση και σωλήνες για να στείλετε είσοδο στο bc. Επεξεργάζεται την εισαγωγή σας και εμφανίζει την απάντηση στο παράθυρο του τερματικού.
Μπορείτε να ανακατευθύνετε στο bc με ή χωρίς την επιλογή -l (τυπική βιβλιοθήκη μαθηματικών).
Για τη διοχέτευση της εισόδου στο bc, η είσοδος πρέπει να είναι η έξοδος μιας άλλης διεργασίας. Είναι βολικό να χρησιμοποιείτε ηχώ για αυτό.
echo 22/7 | bc
echo 22/7 | bc -l
Εάν έχετε κενά στην καταχώρισή σας ή θέλετε να συμπεριλάβετε την εντολή “scale”, τυλίξτε την καταχώρισή σας σε εισαγωγικά.
echo "22 / 7" | bc -l
echo "scale=6; 22 / 7" | bc
Χρήση του bc σε σενάρια Bash Shell
Έχουμε τώρα ό,τι χρειαζόμαστε για να μπορούμε να εκτελούμε υπολογισμούς κινητής υποδιαστολής στα σενάρια bash, με την ακρίβεια που επιλέξαμε. Μπορούμε επίσης να αναφέρουμε μεταβλητές Bash στους υπολογισμούς μας, συμπεριλαμβανομένων των παραμέτρων του σεναρίου.
Εδώ είναι το παράδειγμά μας σενάριο. Αντιγράψτε αυτό το κείμενο σε ένα πρόγραμμα επεξεργασίας, αποθηκεύστε το ως “pi.sh” και μετά κλείστε το πρόγραμμα επεξεργασίας.
#!/bin/bashfirst_number=22
second_number=7
pi=$(echo "scale=$1; $first_number/$second_number" | bc)
echo "Pi to $1 decimal places is: $pi"
Χρησιμοποιούμε δύο μεταβλητές, “first_number” και “second_number” για να κρατήσουμε δύο αριθμητικές τιμές. Χρησιμοποιούμε αυτές τις μεταβλητές στην είσοδο που εισάγουμε στο bc.
Χρησιμοποιήσαμε επίσης την πρώτη παράμετρο γραμμής εντολών που μεταβιβάστηκε στο σενάριο, “$1”, ως τιμή για να ορίσουμε την “κλίμακα”.
Προτού μπορέσουμε να δοκιμάσουμε το σενάριό μας, πρέπει να το κάνουμε εκτελέσιμο με το chmod.
chmod +x pi.sh
Ας δοκιμάσουμε το σενάριό μας με διαφορετικές τιμές γραμμής εντολών.
./pi.sh 5
./pi.sh 14
./pi.sh 20
Εμφανίζεται το pi σε αριθμό θέσεων που καθορίζουμε στη γραμμή εντολών του σεναρίου μας.
Όλα αθροίζονται
Η μετάβαση πέρα από τους περιορισμούς των μαθηματικών μόνο για ακέραιο αριθμό του Bash δίνει στα σενάρια μας ακρίβεια και ακρίβεια.
Η χρήση echo για τη διοχέτευση εισόδου στο bc μέσα σε σενάρια είναι λίγο αδέξια, αλλά λειτουργεί τέλεια και τα οφέλη αξίζουν τον κόπο.
VIA:
HowToGeek.com
