PATRINOS06 Δημοσ. 28 Δεκεμβρίου 2006 Δημοσ. 28 Δεκεμβρίου 2006 γεια σε ολους...σας έχω ζαλισει αρκετες φορες με την ασχετιλα που με δερνει... λοιπον αυτη τη φορα εχω φτιαξει μια συναρτηση που υπολογιζει το παραγοντικο ενος αριθμου...θελω να προβλέψω όμως την περίπτωση του overflow,οταν δηλ το παραγοντικο ειναι πολυ μεγαλος αριθμος...αυτο πως μπορω να το επιτυχω??? εχω σκεφτει κανα 2 ιδεεσ όπως να ελέγξω αν το παραγοντικο είναι 0 να πεταει μηνυμα overflow αλλα κολοκυθια....ολιγη help please....
dop Δημοσ. 28 Δεκεμβρίου 2006 Δημοσ. 28 Δεκεμβρίου 2006 Είναι γενικά μπελάς. Η σωστή λύση είναι να τσεκάρεις τα flags του επεξεργαστή αν έχει συμβεί overflow - αυτό σημαίνει ότι πρέπει να ξέρεις σε τι επεξεργαστή παίζεις, καθώς και να γράφεις assembly σε αυτόν. Άλλη λύση, αν έχεις unsigned ακέραιους τύπους είναι στο http://gcc.gnu.org/ml/gcc-bugs/2001-02/msg00120.html αλλά για κάποιον λόγο δεν μου αρέσει. Η καλύτερή σου λύση είναι να βρεις κάποια βιβλιοθήκη που να παρέχει Big Integers - ουσιαστικά είναι βιβλιοθήκες που χρησιμοποιούν δυναμικά arrays για να παρέχουν όσο μεγάλους int ακόμα και floats θες.
PATRINOS06 Δημοσ. 28 Δεκεμβρίου 2006 Μέλος Δημοσ. 28 Δεκεμβρίου 2006 είναι απλο προγραμματι σε c,δεν το σκεφτομαι καν για status flags,ουτε ξερω να τα δουλεψω και ειναι και πρακτικα αδυνατο....μαλλον θα θεσω καποιον πολυ μεγαλο int κοντα στο max_int και θα βαλω εναν περιορισμο...αλλη ιδεα δεν εχω...
SL9S9 Δημοσ. 29 Δεκεμβρίου 2006 Δημοσ. 29 Δεκεμβρίου 2006 Αν το νέο παραγοντικό είναι μικρότερο από το παλιότερο θα έχει γίνει overflow. Πχ Υπολόγισε το 1o παραγ. στο P (unsigned int) Θεσε P1 = P το επόμενο στο P Aν P<P1 έγινε Overflow κ.ο.κ. Δουλεύει; (ως γνωστόν αν προσθέτεις συνέχεια μια μεταβλητή γίνεται overflow και ξανά από το 0 πχ 4294967295 +1 = 0 )
paulogiann Δημοσ. 30 Δεκεμβρίου 2006 Δημοσ. 30 Δεκεμβρίου 2006 Ναι αλλά δε γνωρίζεις αν η αναπαράσταση του γινομένου έπειτα από Overflow θα δώσει αριθμό μικρότερο από το προηγούμενο παραγοντικό. Τέλοσπαντων, μια καλή λύση χωρίς να ελέγχεις flags στον status register είναι η ακόλουθη: > long int factorial(int a){ if(a>1){ int temp=factorial(a-1); if(a<INT_MAX/temp) return (a*temp); else return -1; } else return 1; }
JimGer Δημοσ. 5 Ιανουαρίου 2007 Δημοσ. 5 Ιανουαρίου 2007 Opos se kovo prepei na eisai protoetis ceidas kai zitas voitheia gia to 3o set askiseon!Sostos?Tesp ego leo na to diloseis long int pou o megaliteros arithmos einai o 4.297.967.295.An thes kane post sto ceid i' stele pm.gerakaris!
kostas_crete Δημοσ. 5 Ιανουαρίου 2007 Δημοσ. 5 Ιανουαρίου 2007 Εναλλακτικά αν και είναι λίγο μπίζιλο, μπορείς να κρατάς σε ένα array ξεχωριστά τις δεκάδες-εκατοντάδες-χιλιάδες-...-νάδες του παραγοντικού σου και μετά να εκτυπώνεις σαν string το αποτέλεσμα. Θα είναι αργό λίγο, λόγω του ότι θα πρέπει να ελέγχεις σε κάθε loop όλους τους αριθμούς να είναι μικρότεροι από 10 αλλιώς αφαίρεσε 10, πρόσθεσε/αφαίρεσε τα ανάλογα από τον προηγούμενο (U get the picture). Στο τέλος εκτυπώνεις το array σου με τους αντίστοιχους χαρακτήρες. Ελπίζω να κατάλαβες τι εννοώ....
Apanepai Δημοσ. 18 Απριλίου 2007 Δημοσ. 18 Απριλίου 2007 Ναι αλλά δε γνωρίζεις αν η αναπαράσταση του γινομένου έπειτα από Overflow θα δώσει αριθμό μικρότερο από το προηγούμενο παραγοντικό.Τέλοσπαντων, μια καλή λύση χωρίς να ελέγχεις flags στον status register είναι η ακόλουθη: > long int factorial(int a){ if(a>1){ int temp=factorial(a-1); if(a<INT_MAX/temp) return (a*temp); else return -1; } else return 1; } Auto stin periptwsi Overflow epistrefei -1. Katalaba to giati alla giati na epistrefei -1 kai oxi ena munima?
parsifal Δημοσ. 18 Απριλίου 2007 Δημοσ. 18 Απριλίου 2007 Auto stin periptwsi Overflow epistrefei -1. Katalaba to giati alla giati na epistrefei -1 kai oxi ena munima? Γιατί έτσι όπως έχει δηλωθεί η συνάρτηση, θα πρέπει να επιστρέφει ακέραιο τύπου long (long int). Όταν η ροή εκτέλεσης επιστρέψει στο πρόγραμμα που κάλεσε τη συνάρτηση, δε σου απαγορεύει κανείς να κάνεις έναν έλεγχο για την τιμή που επιστράφηκε και αν είναι -1, να τυπώσεις εσύ το μήνυμα...
Apanepai Δημοσ. 18 Απριλίου 2007 Δημοσ. 18 Απριλίου 2007 Γιατί έτσι όπως έχει δηλωθεί η συνάρτηση, θα πρέπει να επιστρέφει ακέραιο τύπου long (long int).Όταν η ροή εκτέλεσης επιστρέψει στο πρόγραμμα που κάλεσε τη συνάρτηση, δε σου απαγορεύει κανείς να κάνεις έναν έλεγχο για την τιμή που επιστράφηκε και αν είναι -1, να τυπώσεις εσύ το μήνυμα... Exeis dikio twra to katalaba akribws. Se euxaristw polu gia tin boitheia sou.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.