Προς το περιεχόμενο

Αριθμός δεκαδικών ψηφίων σε αριθμό αορίστου μεγέθους...


desolatorXT

Προτεινόμενες αναρτήσεις

Δεν πρόκειται για καμία άσκηση (το διευκρινίζω μετά το τελευταίο τόπικ περί χρηματισμών :P )... Θέλω λοιπόν έναν τρόπο (όχι κώδικα) ώστε έχοντας ως είσοδο έναν πραγματικό αριθμό αορίστου μεγέθους, να έχω ώς έξοδο τον αριθμό των δεκαδικών ψηφίων του...

 

Π.χ. αν έχω είσοδο το 145,342445 να έχω ώς έξοδο το 6, αν έχω το 1999,2 να έχω ώς έξοδο το 1, κ.ο.κ.... Το έψαξα το θέμα, αλλά έχω κολήσει... Ίσως να είναι κάποια γελία απάντηση, αλλα δεν ξανασχολήθηκα ποτέ με κάτι τέτοιο (αυτοδίδακτος είμαι) και δεν ξέρω τι ακριβώς να κανω...

 

Ευχαριστώ προκαταβολικά :-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κρατάς μόνο τα δεκαδικά του ψηφία με κάποιον τρόπο (ή με συνάρτηση αν έχει η γλώσσα που χρησιμοποιείς ή αφαιρώντας το ακέραιο μέρος).

 

Μετά πολλαπλασιάζεις με το 10 και παίρνεις το ένα και μοναδικό μη δεκαδικό ψηφίο που πλέον θα έχει, π.χ. 7,1234. Φυσικά μπορεί να είναι και μηδενικό.

 

Μετά ξαναπάς στο πρώτο βήμα και επαναλαμβάνεις μέχρι ο αριθμός που θα σου μένει να είναι 0.

 

Έχω μια επιφύλαξη για το αν τα παραπάνω δουλεύουν σε όλες τις γλώσσες και σε όλα τα υπολογιστικά συστήματα λόγω περιορισμένης ακρίβειας των αριθμών. Αν π.χ. 10*0,3333333333 σε κάποιο σύστημα κάνει 3,3333333333 με τον ίδιο αριθμό δεκαδικών λόγω περιορισμένης ακρίβειας, θα πέσεις σε άπειρο loop, οπότε καλύτερα να έχεις ένα μέγιστο αριθμό δεκαδικών ψηφίων που θα ζητάς (π.χ. 18 αν θυμάμαι καλά είναι για double πραγματικούς).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κρατάς μόνο τα δεκαδικά του ψηφία με κάποιον τρόπο (ή με συνάρτηση αν έχει η γλώσσα που χρησιμοποιείς ή αφαιρώντας το ακέραιο μέρος).

 

Μετά πολλαπλασιάζεις με το 10 και παίρνεις το ένα και μοναδικό μη δεκαδικό ψηφίο που πλέον θα έχει, π.χ. 7,1234. Φυσικά μπορεί να είναι και μηδενικό.

 

Μετά ξαναπάς στο πρώτο βήμα και επαναλαμβάνεις μέχρι ο αριθμός που θα σου μένει να είναι 0.

 

Έχω μια επιφύλαξη για το αν τα παραπάνω δουλεύουν σε όλες τις γλώσσες και σε όλα τα υπολογιστικά συστήματα λόγω περιορισμένης ακρίβειας των αριθμών. Αν π.χ. 10*0,3333333333 σε κάποιο σύστημα κάνει 3,3333333333 με τον ίδιο αριθμό δεκαδικών λόγω περιορισμένης ακρίβειας, θα πέσεις σε άπειρο loop, οπότε καλύτερα να έχεις ένα μέγιστο αριθμό δεκαδικών ψηφίων που θα ζητάς (π.χ. 18 αν θυμάμαι καλά είναι για double πραγματικούς).

 

Στην GML δεν υπάρχει επιλογή για διαχωρισμό του ακέραιου μέρους απο το δεκαδικό (δεν απευθύνεται για εφαρμογές μαθηματικών η γλώσσα)... Επίσης υπάρχουν μόνο 2 τύποι μεταβλητών (real, string)... Ίσως ακούγεται χαζό αλλα εξυπηρετεί πολλά πράγματα...

 

Συγκεκριμένα θέλω να το κάνω αυτό για τον εξής λόγο...

Θέλω την εμφάνιση real τιμών σε έναν δυσδιάστατο χώρο... Για να εμφανιστεί κάτι σε ένα draw event πρέπει να είναι τύπου string. Η μετατροπή στην GML απο real σε string γίνετε απλά, με την εντολή string(x), σε αυτήν την μετατροπή όμως κρατώνται για χάρην ταχύτητας και ευκολίας μόνο 2 δεκαδικά ψηφία, γίνετε δλδ αυτόματα στρογγυλοποίηση. Οπότε με ένα script χρησιμοποιώ αντ' αυτού την εντολή string_format(χ,position,demical_count).

Θέλω δηλαδή τον αριθμό των δεκαδικών ψηφίων για να εμφανίσω με ακρίβεια τον αριθμό...

 

Σωστή η πρόταση σου, αλλα δεν ξέρω πως να χωρίσω το ακέραιο απο το δεκαδικό μέρος...

 

ΕDIT: βρήκα κάποιο ανάλογο extension με εντολή διαχωρισμού του δεκαδικού μέρους, παω να το δοκιμάσω, thnx και πάλι :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Με πρόχειρο google, βρήκα

http://gamemaker.wikidot.com/gml:frac

για το δεκαδικό μέρος,

 

καθώς και την string-char-at σαν δεύτερο εναλλακτικό τρόπο με την οποία μπορείς να πάρεις ένα-ένα τα ψηφία, αφού πρώτα εννοείται έχεις καλέσει την string_format με αρκετά μεγάλο decimal_count.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Χρησιμοποιώ τον εξής κώδικα (θα τον καταλάβετε είναι απλός, κ ας μην ξέρετε την γλώσσα)

 

>ADD_event(CREATE) {
drawRes = 0
deccount = 0
temp = 0
count = 0
}

[color="DarkGreen"]//frac είναι η εντολή διαχωρισμού του δεκαδικού, π.χ. για 12,345 δίνει 0,345. 
//Global.result είναι ο αριθμός προς εμφάνιση[/color]

ADD_event(DRAW){
temp = frac(global.result)
while (not(temp = 0)) do {
temp = temp*10
count = count + 1
temp = frac(temp)
}
deccount = count
count = 0
drawRes = string_format(global.result,0,deccount)
}

 

Το θέμα είναι πως στο debug Mode, βλέπω το εξής τρελό, για τον αριθμό 137,856 (που χρησιμοποιώ για να το ελέγξω) εμφανίζει το 137.85600000...., και το deccount (που μετράει τα δεκαδικά ψηφία) έχει πάρει την τιμή 42, wtf? :confused:

 

Με πρόχειρο google, βρήκα

http://gamemaker.wikidot.com/gml:frac

για το δεκαδικό μέρος,

 

καθώς και την string-char-at σαν δεύτερο εναλλακτικό τρόπο με την οποία μπορείς να πάρεις ένα-ένα τα ψηφία, αφού πρώτα εννοείται έχεις καλέσει την string_format με αρκετά μεγάλο decimal_count.

 

Thnx για όλη την βοήθεια, θα συνεχίσω να "πειράζω" τον κώδικα μέχρι να φτιάξει... Το βασικό ήταν να πάρω μια ιδέα για το πως θα μπορούσε να υλοποιηθεί... thnx κ πάλι :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα πρέπει να περιορίσεις τον αριθμό στα ψηφία (ακρίβεια) που επιθυμείς -πχ. 3 ψηφία => 12,345 διαφορετικά ο τύπος real επιστρέφει έναν 32-bit αριθμό τουλάχιστον στην γλώσσα μου (C++ Builder) οπότε γεμίζεις με μηδενικά κτλ.

 

Σε C ο περιορισμός στα 3 δεκαδικά ψηφία γίνεται με %.3f - στην γλώσσα σου δεν ξέρω, αλλά αν μπορείς βρες το ',' και ύστερα κόψε ανάλογα τους περιττούς χαρακτήρες του string ... ή δες αν η γλώσσα σου έχει κάποιο ανάλογο σύστημα περιορισμού της ακρίβειας.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μάλλον έχεις bug, το counter πρέπει να το μηδενίζεις στο event draw, όχι στο create.

 

Επίσης κάνε μια αλλαγή:

while (not(temp = 0)) do {

 

άλλαξέ το σε

while (abs(temp) > 0.001)) do {

 

Την abs πιστεύω ότι θα την έχει η GML, αλλιώς την φτιάχνεις εύκολα.

 

Το 0.001 σημαίνει πόσα μηδενικά συνεχόμενα να έχει ο αριθμός πριν αγνοήσεις τα υπόλοιπα δεκαδικά, π.χ. με 0.001 στον αριθμό

0.12300456000789

θα μετρηθεί μόνο το 0.12300456 ενώ το υπόλοιπο θα αγνοηθεί.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καμία σχέση τελικά με αυτό η λύση... (απλά την παραθέτω μήπως και την χρειαστεί ποτέ κάποιος...)

 

Η αποθηκευση γίνετε με δυαδικό τρόπο οπότε δεν υπάρχει απόλυτη ακρίβεια, γ αυτό δεν λειτουργεί ο κώδικας...Για παράδειγμα αν αποθηκεύσεις τον αριθμό 0.24, αυτός αποθηκεύεται ως 0.2400000000000000032, για αυτό κώδικας έυρισκε το count ίσο με 42.

 

Για να μην φένεται το περιττό μέρος χρειάζεται ο εξής κώδικας:

 

>
ADD_event(CREATE){
str = 0
last = 0
drawRes = 0
}
ADD_event(DRAW){

str = string_format(global.result, 0, 99);

if (string_pos('.', str) > 0) {
  last = string_length(str);
  while (string_char_at(str, last) == '0') last -= 1;
  if (string_char_at(str, last) == '.') last -= 1;
  str = string_copy(str, 1, last);
}

drawRes = str
}

 

Ευχαριστώ για όλη την βοήθεια πάντως παιδιά :-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 5 χρόνια αργότερα...

Μάλλον έχεις bug, το counter πρέπει να το μηδενίζεις στο event draw, όχι στο create.

 

Επίσης κάνε μια αλλαγή:

while (not(temp = 0)) do {

 

άλλαξέ το σε

while (abs(temp) > 0.001)) do {

 

Την abs πιστεύω ότι θα την έχει η GML, αλλιώς την φτιάχνεις εύκολα.

 

Το 0.001 σημαίνει πόσα μηδενικά συνεχόμενα να έχει ο αριθμός πριν αγνοήσεις τα υπόλοιπα δεκαδικά, π.χ. με 0.001 στον αριθμό

0.12300456000789

θα μετρηθεί μόνο το 0.12300456 ενώ το υπόλοιπο θα αγνοηθεί.

ασχετο λιγο με την απαντηση σου αλλα αν εγω θελω να διαβαζω ενα ακεραιο αριθμο ,να απομομωνω την 2η πενταδα των δυαδικων του ψηφιων και να επιστρεφει τον νεα αριθμο,πως θα το εκανα αυτο???

 

 

π.χ Αν εγω θελω να του δωσω το  00011 0000=96, τοτε το προγραμμα να εμφανιζει την τιμη 00011=96

 

Στο εκτελεσιμο αρχειο θελω να εχει βγει κατι τετοιο:

 

Dose arithmo sto [0,1023] :96

O Neos arithmos einai 3

 

Εχεις κανενας καλος σαμαρειτης καμια ιδεα??

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τι διαολο... 6 χρονια σου πηρε να γραψεις το παραπανω ποστ; Δεν καταλαβα Χριστος απ'οσα εγραψες.

Η ερωτηση που σου εκανα αποτελει μερος μιας ασκησης.Δεν εχει καμια σχεση ουτε με το ποστ,ουτε ειμαι εγω αυτος που εβαλε το θεμα.Πες μου που κολλησες να σου εξηγησω τι θελω

Η ερωτηση που σου εκανα αποτελει μερος μιας ασκησης.Δεν εχει καμια σχεση ουτε με το ποστ,ουτε ειμαι εγω αυτος που εβαλε το θεμα.Πες μου που κολλησες να σου εξηγησω τι θελω

Εκανα αυτη την ερωτηση γιατι εψαχνα να βρω πως να μετακινω δεκαδικα ψηφια στο διαδικτυο και αυτο εδω ηταν 1ο αποτελεσμα γι αυτο

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Συμφωνώ και εγώ με τον παπί. Δεν κατάλαβα τίποτα.

 

Τι σχέση έχει "αριθμός δεκαδικών ψηφίων" με τον ακέραιο που ζητάς ? Ακόμη και να είχε σχέση, που το ξέθαψες θέμα από το 2007 ? Λογικά θα πρέπει να γίνει split σε νέο θέμα.

 

Παρουσιάζεις τον αριθμό ως 00011 0000 (5 ψηφία - 4 ψηφία) και θέλεις να απομονώνει τη 2η πεντάδα και μετά αγνοείς τα 4 low ψηφία. Όπως σου είπε και ο albNik το 96 που το βρήκες ?

 

 

Αν κατάλαβα καλά θέλεις να δίνει ο χρήστης 48 και να παίρνει απάντηση 3 ? Δηλαδή μιλάμε για ένα right shift τεσσάρων bit ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Mια άλλη λύση είναι να δεις τον αριθμό σαν string έτσι με rexexp να πάρεις το δεκαδικό μέρος σαν string και μετά μετράς το μέγεθος του string. Το regexp είναι απλό λόγο ότι απλά πρέπει να πάρεις το μέρος που αρχίζει με , ή τελεία (στο εξωτερικό η υποδιαστολή είναι η τελεία).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...