Μια φορά κι έναν καιρό ήταν ένας σοφός υπηρέτης που έσωσε τη ζωή ενός πρίγκιπα. Ο βασιλιάς υποσχέθηκε να πληρώσει ό,τι μπορούσε να ονειρευτεί ο υπηρέτης. Γνωρίζοντας ότι ο βασιλιάς αγαπούσε το σκάκι, ο υπηρέτης είπε στον βασιλιά ότι θα ήθελε να πάρει κόκκους σιταριού. Έναν κόκκο στο πρώτο τετράγωνο μιας σκακιέρας, με τον αριθμό των κόκκων να διπλασιάζεται σε κάθε επόμενο τετράγωνο.
Υπολόγισε τον αριθμό των κόκκων σιταριού σε μια σκακιέρα.
Μια σκακιέρα έχει 64 τετράγωνα. Το τετράγωνο 1 έχει έναν κόκκο, το τετράγωνο 2 έχει δύο κόκκους, το τετράγωνο 3 έχει τέσσερις κόκκους, και ούτω καθεξής, διπλασιάζοντας κάθε φορά.
Γράψε κώδικα που υπολογίζει:
Από προεπιλογή, οι αριθμοί στην awk αναπαρίστανται ως αριθμοί κινητής υποδιαστολής
διπλής ακρίβειας. Αυτό παρέχει 53 bits ακρίβειας (δες τον Πίνακα
16.3 στο εγχειρίδιο). Δυστυχώς, δεν αρκεί για να ολοκληρώσεις αυτή την
άσκηση (προειδοποίηση spoiler: ένα test απαιτεί 63 bits ακρίβειας).
Η "ανεπαρκής ακρίβεια" μοιάζει κάπως έτσι:
$ gawk 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
not enough precision
Το GNU awk μπορεί να χρησιμοποιήσει αριθμούς αυθαίρετης ακρίβειας, αν οι σχετικές
βιβλιοθήκες έχουν μεταγλωττιστεί στο εκτελέσιμο του awk. Έλεγξε την έκδοση του awk
σου και ψάξε για το "GNU MPFR":
$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
...
Αν υπάρχει, ενεργοποίησε τη δυνατότητα με την επιλογή -M:
$ gawk -M 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
OK
Τι γίνεται αν το awk μου δεν έχει το -M; Θα πρέπει να καλέσεις ένα εξωτερικό
πρόγραμμα που μπορεί να κάνει αριθμητική αυθαίρετης ακρίβειας, όπως το bc. Δες την
ενότητα Χρήση του getline σε μεταβλητή από σωλήνα για ένα παράδειγμα
του πώς γίνεται αυτό.
Περαιτέρω ανάγνωση: Αριθμητική αυθαίρετης ακρίβειας
Γράψου στο Exercism για να μάθεις και να κατακτήσεις AWK με 3 έννοιες92 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.