Αποστολέας Θέμα: Υλοποίηση Ακέραιου Μέρους  (Αναγνώστηκε 1476 φορές)

progmat

  • Θαμώνας
  • ***
  • Μηνύματα: 21
Υλοποίηση Ακέραιου Μέρους
« στις: 01 Φεβ 2020, 07:22:18 μμ »
Καλησπέρα σας,

μπορούμε να υλοποιήσουμε στη ΓΛΩΣΣΑ δική μας συνάρτηση για το Α_Μ(); Δηλαδή να γράψουμε μια συνάρτηση που να κάνει την ίδια δουλειά με την Α_Μ() χωρίς φυσικά να χρησιμοποιήσουμε την Α_Μ(); Ευχαριστώ για το χρόνο σας!

akalest0s

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 247
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #1 στις: 01 Φεβ 2020, 08:33:34 μμ »
Ίσως όχι η πιο κομψή λύση, still it gets the job done.
Κώδικας: Javascript
  1. ΠΡΟΓΡΑΜΜΑ εκτός_υλοποίησηΣυνΑ_Μ
  2. ΜΕΤΑΒΛΗΤΕΣ
  3.   ΠΡΑΓΜΑΤΙΚΕΣ: α
  4. ΑΡΧΗ
  5.   ΔΙΑΒΑΣΕ α
  6.   ΓΡΑΨΕ custom_A_M(α)
  7. ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
  8. ! ==================
  9. ΣΥΝΑΡΤΗΣΗ custom_A_M(α): ΑΚΕΡΑΙΑ
  10. ΜΕΤΑΒΛΗΤΕΣ
  11.   ΑΚΕΡΑΙΕΣ: i
  12.   ΠΡΑΓΜΑΤΙΚΕΣ: α
  13. ΑΡΧΗ
  14.   i <- 0
  15.   ΟΣΟ i <= Α_Τ(α) ΕΠΑΝΑΛΑΒΕ
  16.     ΑΝ i < Α_Τ(α) ΚΑΙ i + 1 > Α_Τ(α) ΤΟΤΕ
  17.       custom_A_M <- i
  18.     ΤΕΛΟΣ_ΑΝ
  19.     i <- i + 1
  20.   ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  21. ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

υγ> αν δεν θες ούτε Α_Τ, τότε πάρε περιπτώσεις χωριστά "αν α=>0" και "αν α<0"
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

ApoAntonis

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 134
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #2 στις: 01 Φεβ 2020, 10:58:53 μμ »
@ akalestos,
 αν το a είναι αρνητικός, επιστρέφεις θετική τιμή
και νομίζω ότι στην περίπτωση που έχουμε δεκαδικό μέρος μηδέν δεν δουλεύει σωστά


παίρνω δεδομένο ότι το ακέραιο μέρος το "χρησιμοποιούμε" μόνο για θετικούς:

Κώδικας: [Επιλογή]

i <- 0
ΟΣΟ ( i < a) ΕΠΑΝΑΛΑΒΕ
  i <-i+1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΝ i = a TOTE
  AM<- i
ΑΛΛΙΩΣ
  AM <- i-1
ΤΕΛΟΣ_ΑΝ


akalest0s

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 247
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #3 στις: 01 Φεβ 2020, 11:34:01 μμ »
Έχεις δίκιο. Η περίπτωση μηδενικού δεκαδικού μέρους, λύνεται απλά με ένα = στην πρώτη ανισότητα της Αν.
Τώρα πως μου ήρθε να γυρίζω πάντα θετικό αριθμό, δεν ξέρω! Τελείως άκυρο, δεν ξέρω τι σκεφτόμουν!  :D
Εύκολα διορθώνεται και αυτό, αλλά ο δικός σου κώδικας είναι καλύτερος, οπότε δεν μπαίνω στο κόπο να διορθώσω.
« Τελευταία τροποποίηση: 01 Φεβ 2020, 11:54:14 μμ από akalest0s »
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

akalest0s

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 247
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #4 στις: 01 Φεβ 2020, 11:51:53 μμ »
παίρνω δεδομένο ότι το ακέραιο μέρος το "χρησιμοποιούμε" μόνο για θετικούς:

Γράφω το ίδιο και για αρνητικούς, αν το θέλει ο progmat (με εμφώλευση, φυσικά υπάρχουν και άλλοι τρόποι)
Κώδικας: [Επιλογή]
ΣΥΝΑΡΤΗΣΗ ΑΜ(α): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i
  ΠΡΑΓΜΑΤΙΚΕΣ: α
ΑΡΧΗ
  i <- 0
  ΟΣΟ i <= Α_Τ(α) ΕΠΑΝΑΛΑΒΕ
    i <- i + 1
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΝ i = α ΤΟΤΕ
    AMv2 <- i
  ΑΛΛΙΩΣ
    ΑΝ α >= 0 ΤΟΤΕ
      AMv2 <- i - 1
    ΑΛΛΙΩΣ
      AMv2 <- -(i - 1)
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
« Τελευταία τροποποίηση: 02 Φεβ 2020, 12:17:12 πμ από akalest0s »
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

George Eco

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 336
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #5 στις: 02 Φεβ 2020, 07:01:53 πμ »
Η δομή επανάληψης ΓΙΑ με βήμα 1.0 κάνει όλη τη δουλεία.

Κώδικας: [Επιλογή]
ΠΡΟΓΡΑΜΜΑ Εναλλακτική_προσέγγιση
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: α
ΑΡΧΗ
  ΔΙΑΒΑΣΕ α  ! α = πραγματικός αριθμός που εισάγεται
  ΓΡΑΨΕ ακεραιοποίηση(α)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΣΥΝΑΡΤΗΣΗ ακεραιοποίηση(α): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
  ΠΡΑΓΜΑΤΙΚΕΣ: α, κ
ΑΡΧΗ
  ι <- 0
  κ <- 0.0 ! κ = μετρητής ακεραίων μονάδων
  ΓΙΑ κ ΑΠΟ 1.0 ΜΕΧΡΙ Α_Τ(α) ΜΕ_ΒΗΜΑ 1.0
    ι <- ι + 1 ! Το βήμα 1.0 αποκλείει το δεκαδικό μέρος
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΑΝ α < 0.0 ΤΟΤΕ
    ι <- ι*-1 ! Επαναφορά προσήμου
  ΤΕΛΟΣ_ΑΝ
  ακεραιοποίηση <- ι ! Επιστροφή ακεραίου
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Πώς σας φαίνεται;
« Τελευταία τροποποίηση: 03 Φεβ 2020, 01:46:35 πμ από George Eco »

akalest0s

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 247
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #6 στις: 02 Φεβ 2020, 12:15:56 μμ »
Πώς σας φαίνεται;
Τελείως λάθος.





μια χαρά είναι  8)
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

George Eco

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 336
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #7 στις: 02 Φεβ 2020, 04:50:48 μμ »
Δε σου κρύβω συνάδελφε πως δεν είδα στην αρχή τη πιο κάτω γραμμή του σχόλιού σου και την πάτησα!
Λέω, γιατί το αποκαλεί τελείως λάθος; Είχα κάνει και double check τα πάντα, όχι τίποτα άλλο.
Μου την έφερες!  ;D ;D ;D

gthal

  • Ομάδα διαγωνισμάτων 2017
  • *
  • Μηνύματα: 947
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #8 στις: 03 Φεβ 2020, 11:01:53 πμ »
Πώς σας φαίνεται;
Ωραία και απλή η ιδέα!
Δύο παρατηρήσεις όμως:
1) Για τους αρνητικούς τι γίνεται;  πχ Α_Μ(-4)=-4  αλλά Α_Μ(-4.1)=-5, καθώς το Α_Μ(χ) είναι ο μικρότερος ακέραιος που δεν υπερβαίνει τον χ (εξαρτάται από την υλοποίηση βέβαια, αλλά και ο διερμηνευτής έτσι το υλοποιεί απ' ότι βλέπω). Οπότε χρειάζεται λίγο μαγείρεμα η τελευταία ΑΝ
2) Υπάρχει ζήτημα αποδοτικότητας βέβαια: έδωσα το 123456789.01 ας πούμε και δεν πήρα απάντηση ούτε σε ένα λεπτό... (είναι και λίγο παλιό το μηχάνημά μου βέβαια ...  :P )

Στον παρακάτω κώδικα αξιοποιώ την ιδέα σου επαναληπτικά ως εξής:
για τον 352,61 πχ :
διαιρώ μέχρι να γίνει μικρότερος του 1, για να μετρήσω τα ακέραια ψηφία (έστω cnt)
οπότε έχω τον 0,35261
στη συνέχεια πολ/σιάζω ξανά τόσες φορές (cnt=3) και κάθε φορά προσεγγίζω το καινούριο δεκαδικό κομμάτι με τη μέθοδό σου
πχ στην 1η επανάληψη έχω το 3,5261 και με τη μέθοδό σου φτάνω στο 3
στη 2η επανάληψη έχω το το 35,261  και αυτή τη φορά ξεκινώ από το 30 (δεκαπλασιάζοντας το προηγούμενο αποτέλεσμα) και φτάνω στο 35
στην 3η επανάληψη έχω το 352,61 και αυτή τη φορά ξεκινώ από το 350 (δεκαπλασιάζοντας το προηγούμενο αποτέλεσμα) και φτάνω στο 352

Κώδικας: [Επιλογή]
ΣΥΝΑΡΤΗΣΗ ΑΜ(y):ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: x, y ,cnt
  ΑΚΕΡΑΙΕΣ: result , c, r, k
ΑΡΧΗ
    x <- Α_Τ(y)
    ! διαιρώ επαναληπτικά για να μετρήσω τα ακέραια ψηφία
    cnt <- 0
    ΟΣΟ x>=1 ΕΠΑΝΑΛΑΒΕ
      x <- x/10
      cnt <- cnt+1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ! ξαναπολ/σιάζω επαναληπτικά, προσεγγίζοντας το κάθε ψηφίο
    result <- 0
    ΓΙΑ c ΑΠΟ 1 ΜΕΧΡΙ cnt
      x <- x*10
      result <- result*10
      r <- result
      ΓΙΑ k ΑΠΟ result+1 ΜΕΧΡΙ x
        r <- r+1
      ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
      result <- r
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ! προσαρμογές για τους αρνητικούς
    ΑΝ y<0 ΤΟΤΕ
      result <- -result
      ΑΝ result<>y ΤΟΤΕ
        result <- result -1
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΑΝ
    ΑΜ <- result
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

edit: αυτό που λέω για την υλοποίηση της Α_Μ(χ) στο διερμηνευτή δεν είναι ακριβές. Μόλις τώρα είδα ότι υπάρχει επιλογή που εγώ έχω ενεργοποιημένη. Δε θυμάμαι αν υπάρχει οδηγία από το υπουργείο για την Α_Μ των αρνητικών
« Τελευταία τροποποίηση: 03 Φεβ 2020, 11:26:10 πμ από gthal »
Φιλικά,
Γιώργος Θαλασσινός

progmat

  • Θαμώνας
  • ***
  • Μηνύματα: 21
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #9 στις: 03 Φεβ 2020, 12:48:40 μμ »
Σας ευχαριστώ πολύ  όλους για την ενασχόληση!

George Eco

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 336
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #10 στις: 04 Φεβ 2020, 09:00:36 μμ »
Γιώργο καλησπέρα! Πολύ μου άρεσαν τσ σχόλιά σου!
Δείχνουν πως κατέχεις βαθιά γνώση στο αντικείμενο.

Όντως η Α_Μ() μπορεί να επιστρέψει δοθέντος -4.01 ως αποτέλεσμα το -5, ανάλογα την αντιμετώπιση του διερμηνευτή, αν και προσωπικά θεωρώ λάθος να επιστρέφει -5.
Επειδή είναι θεωητική η ΓΛΩΣΣΑ, σχεδιασμένη στο χαρτί από το Υπουργείο, κι εγώ μέχρι να βγεί κάποια οδηγία, ακολουθώ αυτό που ξεκάθαρα λέει το βιβλίο στο Κεφ 7.
Επιστρέφω μόνο το ακέραιο μέρος.

Τώρα για το θέμα αποδοτικότητας με τον αστρονομικό αριθμό, δέχομαι το σχόλιο. Σωστός! Μπορώ και καλύτερα.
Μεγάλη πρόκληση να μηχανευτώ κάτι, το μηχανεύτηκα, το κάνω debug, θα το αναρτήσω σύντομα!
 Σημείωση: Η πρότασή σου, αν κι έχει ενδιαφέρον, δε βοήθησε πολύ. Εννοώ το πηλίκο δεν έκανε μεγάλη διαφορά και με προβλημάτισε.
Τρέξε τη για 123456789.01 δεν αποδίδει πολύ καλά. Κι είναι λογικό, βασιζόταν στη δική μου εκδοχή.
Οπότε Γιώργο ανέμενε, θα μοιραστώ κάτι ενδιαφέρον σύντομα.
« Τελευταία τροποποίηση: 05 Φεβ 2020, 03:19:48 πμ από George Eco »

George Eco

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 336
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #11 στις: 05 Φεβ 2020, 03:14:20 πμ »
Νομίζω τα κατάφερα!

Κώδικας: [Επιλογή]
ΠΡΟΓΡΑΜΜΑ Αποδοτική_υλοποποίηση_ΑΜ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Υ
  ΠΡΑΓΜΑΤΙΚΕΣ: χ
ΑΡΧΗ
  ΔΙΑΒΑΣΕ χ
  Υ <- ΑΜ(χ)
  ΓΡΑΨΕ Υ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

! Λειτουργεί όπως η Α_Μ()
! ωστόσο -4.01 επιστρέφει 4
ΣΥΝΑΡΤΗΣΗ ΑΜ(χ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ΑΨ, δ, ψ, βάση_εις_τη_ψ, αχ
  ΠΡΑΓΜΑΤΙΚΕΣ: χ, χε
ΑΡΧΗ
! ΑΨ = Ακέραιο ψηφίο
!  δ = δύναμη
!  ψ = ψηφίο
!  βάση_εις_τη_ψ = 10 ^ Ψ
!  αχ = ακέραιο μέρος του χ
!   χ = Το αυθεντικό χ που δίνει ο χρήστης
!  χε = Το χ με το οποίο θα εργαστούμε
  αχ <- 0
  χε <- Α_Τ(χ)
! 19 ψηφία αριθμός
  ΓΙΑ ψ ΑΠΟ 19 ΜΕΧΡΙ 1 ΜΕ_ΒΗΜΑ -1
    βάση_εις_τη_ψ <- 1 ! Αρχικοποίηση
    ΓΙΑ δ ΑΠΟ 0 ΜΕΧΡΙ ψ - 1 ! Χτίσιμο δύναμης βάσης 10
      ΑΝ δ = 0 ΤΟΤΕ
        βάση_εις_τη_ψ <- 1
      ΑΛΛΙΩΣ
        βάση_εις_τη_ψ <- βάση_εις_τη_ψ* 10
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ΑΨ <- 0 ! Αρχικοποίηση
    ΟΣΟ χε/ βάση_εις_τη_ψ >= 1 ΕΠΑΝΑΛΑΒΕ
      ΑΨ <- ΑΨ + 1
      χε <- χε - βάση_εις_τη_ψ
      ! Πόσες φορές χωρά η βάση εις την Ψ
      ! Κι αφαίρεση αυτής, μία προς μία.
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    αχ <- αχ + ΑΨ* βάση_εις_τη_ψ
    ! Προσθήκη βάσης εις τη ψ επί τις φορές που περιέχεται
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΝ χ < 0 ΤΟΤΕ
    ! Διόρθωση προσήμου.
    αχ <- αχ*(-1)
  ΤΕΛΟΣ_ΑΝ
  ΑΜ <- αχ
  ! Απόδοση αποτελέσματος
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Η μεγαλύτερη δυσκολία είναι πως έχουμε πραγματικό, δε μπορούμε να χρησιμοποιήσουμε Α_Μ() οπότε και δε μπορούμε να χρησιμοποιήσουμε DIV και MOD.
Αλλά σα να μην έφτανε αυτό... η ύψωση σε δύναμη επιστρέφει πραγματικό ( για το ενδεχόμενο α^(1/ν) ) οπότε και δε μπορείς να υλοποιήσεις εύκολα δύναμη.

Με όλους αυτούς τους περιορισμούς, νόμιζα πως ίσως τελικά δε γινόταν να βγει αποδοτική λύση.
Αλλά ευχαριστώ για την υπόδειξη γιατί με προκάλεσε και με ενέπνευσε. Δε θα κοιμόμουν αν δε το έλυνα.
Λειτουργεί για δεκαεξαψήφιους ακεραίους δίχως πρόβλημα.

ΣΗΜΕΙΩΣΗ: Τη βελτιστοποιώ συνεχώς   Νομίζω πως τη βελτίωσα αρκετά. Έβαλα και σχόλια.
« Τελευταία τροποποίηση: 05 Φεβ 2020, 04:06:04 πμ από George Eco »

gthal

  • Ομάδα διαγωνισμάτων 2017
  • *
  • Μηνύματα: 947
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #12 στις: 07 Φεβ 2020, 12:58:08 μμ »
Όντως η Α_Μ() μπορεί να επιστρέψει δοθέντος -4.01 ως αποτέλεσμα το -5, ανάλογα την αντιμετώπιση του διερμηνευτή, αν και προσωπικά θεωρώ λάθος να επιστρέφει -5.
Επειδή είναι θεωητική η ΓΛΩΣΣΑ, σχεδιασμένη στο χαρτί από το Υπουργείο, κι εγώ μέχρι να βγεί κάποια οδηγία, ακολουθώ αυτό που ξεκάθαρα λέει το βιβλίο στο Κεφ 7.
Επιστρέφω μόνο το ακέραιο μέρος.
Συμφωνώ μαζί σου, στον προγραμματισμό, είναι μάλλον χρησιμότερο το Α_Μ(-3.5)=-3 και όχι -4 (που είναι ο μαθηματικός ορισμός)

Σημείωση: Η πρότασή σου, αν κι έχει ενδιαφέρον, δε βοήθησε πολύ. Εννοώ το πηλίκο δεν έκανε μεγάλη διαφορά και με προβλημάτισε.
Τρέξε τη για 123456789.01 δεν αποδίδει πολύ καλά. Κι είναι λογικό, βασιζόταν στη δική μου εκδοχή.
Γιατί λες ότι δεν αποδίδει; Μου δίνει αποτέλεσμα "αμέσως" (εμπειρικά το λέω, δεν έχω κάνει μετρήσεις βέβαια  ;) )

Ναι, η καινούρια λύση δίνει γρήγορα την απάντηση!
Δεν είχα πολύ χρόνο για να την καταλάβω αλλά αυτό που κάνεις με τις δυνάμεις του 10 ίσως μοιάζει με μια άλλη προσέγγιση που είχα προσπαθήσει και σου την παραθέτω μήπως την εξετάσεις (σόρυ που δεν έχει εξηγήσεις-σχόλια, αν χρειαστείς θα προσπαθήσω να αναλύσω)

Κώδικας: [Επιλογή]
ΣΥΝΑΡΤΗΣΗ ΑΜ(y):ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: x, y
  ΑΚΕΡΑΙΕΣ: x1, x2, step, result
ΑΡΧΗ
    x <- Α_Τ(y)
    x1 <- 1
    ΟΣΟ x1<x ΕΠΑΝΑΛΑΒΕ
      x1 <- x1*10
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ΑΝ x1=x ΤΟΤΕ
      result <- x1
    ΑΛΛΙΩΣ
      x1 <- x1 div 10
      step <- x1
      ΟΣΟ step>0 ΕΠΑΝΑΛΑΒΕ
        ΟΣΟ x1<x ΕΠΑΝΑΛΑΒΕ
          x1 <- x1 + step
        ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
        ΑΝ x1=x ΤΟΤΕ
          result <- x1
          step <- 0
        ΑΛΛΙΩΣ
          x1 <- x1 - step
          step <- step DIV 10
        ΤΕΛΟΣ_ΑΝ
      ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
      result <- x1
    ΤΕΛΟΣ_ΑΝ

    ΑΝ y<0 ΤΟΤΕ
      result <- -result
    ΤΕΛΟΣ_ΑΝ
    ΑΜ <- result
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
Φιλικά,
Γιώργος Θαλασσινός

George Eco

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 336
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #13 στις: 08 Φεβ 2020, 07:12:48 μμ »
Γιατί λες ότι δεν αποδίδει; Μου δίνει αποτέλεσμα "αμέσως" (εμπειρικά το λέω, δεν έχω κάνει μετρήσεις βέβαια  ;) )

Αποδίδει έχεις δίκιο συνάδελφε. Κάτι λάθος συνέβη με τα copy paste μάλλον κι έτρεξα λάθος κώδικα. Το δοκίμασα τώρα και λειτουργεία καλά.

Για το νέο κώδικα:
Αχά! Μάλιστα! Πολύ ενδιαφέρουσα η προσέγγισή σου συνάδελφε!
Διαφέρει λίγο αλλά μου αρέσει το σκεπτικό της σταδιακής τομής κι ενίοτε ελέγχου ισότητας.

Θέλω να είμαι δίκαιος.
Έκανα beta και τις τρεις προσεγγίσεις (τη δική μου, τη νέα που μου έστειλες και την Α_Μ() )

Η ΑΜ() σκάει στο 11 ψηφίο.
Η δική μου προσέγγιση στο 17ο
Η δική σου στο 18ο!
Αυτό την κάνει καλύτερη κατά ένα ολόκληρο ψηφίο, γενονός που πρέπει να αναφερθεί!

17 ψηφία

Original :  12345678909876543

Δική μου: 12345678909876544

Δική σου: 12345678909876543 (!)

Α_Μ():      1575954752

=====================================

16 ψηφία

Original:   1234567890987654

Δική σου: 1234567890987654

Δική μου: 1234567890987654

Α_Μ():      1016588934

======================================

Η Α_Μ() for the record τη παλεύει μέχρι και 10 ψηφία, μετά το χάνει.

Η fusion εκδοχή με τη διαίρεση, λειτουργεί σα τη δική μου, με περισσότερη απόκλιση όμως:
Original:   12345678909876543
Δική μου: 12345678909876544
Δική σου: 12345678909876543
Fusion:     12345678909876541

Αλλά περίμενε, έχει κι άλλο!!!


99999999
Μέχρι 8 ψηφία όλα καλά η ΑΜ() και η δική σου κι η δική μου.

Στα 9 ψηφία η δική μουκι η fusion στρογγυλοποιούν στο 1000000000

Οπότε we got a winner!
Από την άλλη, θέλω να δω αν μπορώ να διορθώσω τη δική μου προσέγγιση.
Νομίζω δικαιούμαι την ευκαιρία μιας κι έκανα το testing.

I'll be back! :P :P :P


Πραγματικά  όταν γίνεται τέτοιου επιπέδου συζήτηση ενθουσιάζομαι!!!
« Τελευταία τροποποίηση: 08 Φεβ 2020, 07:27:39 μμ από George Eco »

bugman

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 532
  • The Bug Eater
    • Πληροφορική Προγραμματισμός
Απ: Υλοποίηση Ακέραιου Μέρους
« Απάντηση #14 στις: 08 Φεβ 2020, 11:19:36 μμ »
Υπάρχει και αυτή η λύση:
1. ΠΡΟΣΘΗΚΗ ΔΕΥΤΕΡΗΣ ΣΥΝΘΗΚΗΣ
ΟΣΟ c + b <= a ΚΑΙ c <> c + b ΕΠΑΝΑΛΑΒΕ
ΓΙΑ ΑΠΟΦΥΓΗ ΠΡΟΒΛΗΜΑΤΟΣ.
2. ΑΦΑΙΡΕΣΗ ΜΙΑΣ ΜΕΤΑΒΛΗΤΗΣ (ΔΟΥΛΕΥΕΙ ΜΕ ΤΡΕΙΣ ΤΩΡΑ)

Κώδικας: [Επιλογή]
ΠΡΟΓΡΑΜΜΑ bugman_A_Y
ΑΡΧΗ
  ΓΡΑΨΕ Π_Α_Μ(11111111111021200121.2)
  ΓΡΑΨΕ Π_Α_Μ(13.12321)
  ΓΡΑΨΕ Π_Α_Μ(1210023.12321)
  ΓΡΑΨΕ Π_Α_Μ(3.92321)
  ΓΡΑΨΕ Π_Α_Μ(3.92321*10^-30)
  ΓΡΑΨΕ Π_Α_Μ(9.111292321)
  ΓΡΑΨΕ Π_Α_Μ(123456789.01)
  ΓΡΑΨΕ Π_Α_Μ(123123456456789.123)
  ΓΡΑΨΕ Π_Α_Μ(123123000456789.123)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
ΣΥΝΑΡΤΗΣΗ Π_Α_Μ(a): ΠΡΑΓΜΑΤΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: a, b, c
ΑΡΧΗ
  b <- 1
  a <- Α_Τ(a)
  ΟΣΟ b < a ΕΠΑΝΑΛΑΒΕ
    b <- b*10
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  c <- 0
  b <- b/10
  ΟΣΟ b >= 1 ΕΠΑΝΑΛΑΒΕ
    ΟΣΟ c + b <= a ΚΑΙ c <> c + b ΕΠΑΝΑΛΑΒΕ
      c <- c + b
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    b <- b/10
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  Π_Α_Μ <- c
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


1.11111111110212E19
13.00
1210023.00
3.00
0.00
9.00
123456789.00
123123456456789.00
123123000456789.00