Γιαννούλης Γιώργος, δουλεύει μεν αλλά με περιορισμούς πχ στο
Η ΓΡΑΨΕ Α_Μ_custom(11111111100121.2*10^10) δίνει ότι να είναι (6371445259360010240) ενώ η αρχική δική μου δίνει το ακέραιο μέρος (ως πραγματική) 1.11111111110212E29
Παρακάτω έχω αφαιρέσει την ΣΥΝΑΡΤΗΣΗ εις_την(βαση, εκθετης): ΑΚΕΡΑΙΑ
και έχω βάλει έναν πίνακα εισ_την[100]
Έτσι έχουμε το λεγόμενο look up table (ή πίνακα αντιστοιχιών). Αν είχαμε γενικές (σφαιρικές) μεταβλητές ο πίνακας θα μπορούσε να ήταν "μόνιμος", έτσι σε κάθε κλήση θα κερδίζαμε σε ταχύτητα. Κάτι τέτοιο δεν μπορεί να γίνει στη γλώσσα. Θα πρέπει να το δίνουμε σαν παράμετρο, και θα γίνεται αντιγραφή όλου του πίνακα. Οπότε ξεχνάμε το πίνακα να είναι φτιαγμένος μια φορά. Καθώς υπολογίζουμε τη μέγιστη δύναμη παράγουμε τα στοιχεία του πίνακα που θέλουμε. Έχουμε έναν αρκετά μεγάλο πίνακα για να παρέχουμε όλα τα στοιχεία.
ΠΡΟΓΡΑΜΜΑ Ακεραιο_Μερος2
ΑΡΧΗ
ΓΡΑΨΕ Α_Μ_custom(11111111100121.2)
ΓΡΑΨΕ Α_Μ_custom(-13.12321)
ΓΡΑΨΕ Α_Μ_custom(1210023.12321)
ΓΡΑΨΕ Α_Μ_custom(3.92321)
ΓΡΑΨΕ Α_Μ_custom(3.92321*10^-30)
ΓΡΑΨΕ Α_Μ_custom(9.111292321)
ΓΡΑΨΕ Α_Μ_custom(123456789.01)
ΓΡΑΨΕ Α_Μ_custom(123123456456789.123)
ΓΡΑΨΕ Α_Μ_custom(123123000456789.123)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
ΣΥΝΑΡΤΗΣΗ Α_Μ_custom(χ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: δυναμη, προσημο, αμ, εισ_την[100]
ΠΡΑΓΜΑΤΙΚΕΣ: χ, χ_προσωρινο
ΑΡΧΗ
!Ευρεση προσήμου
προσημο <- 1
ΑΝ χ < 0 ΤΟΤΕ
προσημο <- -1
ΤΕΛΟΣ_ΑΝ
χ_προσωρινο <- χ*προσημο
!Υπολογισμός μέγιστης δύναμης του 2 που θα χρειαστούμε
δυναμη <- 0
εισ_την[δυναμη + 1] <- 1
ΟΣΟ 2^δυναμη <= χ_προσωρινο ΕΠΑΝΑΛΑΒΕ
δυναμη <- δυναμη + 1
εισ_την[δυναμη + 1] <- εισ_την[δυναμη]*2
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
αμ <- 0
ΓΙΑ δυναμη ΑΠΟ δυναμη ΜΕΧΡΙ 0 ΜΕ_ΒΗΜΑ -1
ΑΝ χ_προσωρινο >= 2^δυναμη ΤΟΤΕ
!Επειδή η ^ επιστρέφει πραγματικό και θέλουμε ακέραιο
!και δεν μπορούμε να χρησιμοποιήσουμε την Α_Μ
αμ <- αμ + εισ_την[δυναμη + 1]
χ_προσωρινο <- χ_προσωρινο - 2^δυναμη
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
αμ <- αμ*προσημο
!Επειδή η υλοποίηση γίνεται με τον μαθηματικό ορισμό για αρνητικές τιμές
ΑΝ προσημο = -1 ΚΑΙ αμ <> χ ΤΟΤΕ
αμ <- αμ - 1
ΤΕΛΟΣ_ΑΝ
Α_Μ_custom <- αμ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
Και η γραμμή
χ_προσωρινο <- χ_προσωρινο - 2^δυναμη
μπορεί να γίνει:
χ_προσωρινο <- χ_προσωρινο - εισ_την[δυναμη + 1]
εδώ αντί για 6371445259360010240 γυρίζει -1
στο ΓΡΑΨΕ Α_Μ_custom(11111111100121.2*10^10)