maniac89 Δημοσ. 20 Σεπτεμβρίου 2011 Δημοσ. 20 Σεπτεμβρίου 2011 έχω έναν αριθμό κινητής υποδιαστολης π.χ. το 814.615? υπάρχει κάποια συνάρτηση που να κάνει split ώστε να παίρνω σε δύο ακέραιες μεταβλητές π.χ.i=814 και y=615 ή πρέπει να το προγραμματίσω? ευχαριστώ πολύ!!
defacer Δημοσ. 20 Σεπτεμβρίου 2011 Δημοσ. 20 Σεπτεμβρίου 2011 Σαν κάτι να λείπει... σαν κάτι να λείπει...
Timonkaipumpa Δημοσ. 20 Σεπτεμβρίου 2011 Δημοσ. 20 Σεπτεμβρίου 2011 Συνάρτηση δεν μπορώ να σου πω γιατί δεν ξέρω σε ποια γλώσσα αναφέρεσαι (μάλλον αυτό εννοεί και ο defacer). Αλγόριθμοι υπάρχουν. Ένας από αυτούς είναι να εκφράζεις το δεκαδικό μέρος με κάποια από τα bits του αριθμού και με τα άλλα τον αριθμό. Βέβαια, εκεί θα πρέπει να δεις το range που έχεις κτλ κτλ. Αλλά, εάν δεν έχεις πρόβλημα επεξεργαστικής ισχύος (ή/και μνήμης), τότε γιατί θες να μπλέξεις με fixed points;
defacer Δημοσ. 20 Σεπτεμβρίου 2011 Δημοσ. 20 Σεπτεμβρίου 2011 α!sorry! σε C Τώρα καλύτερα. Κατ' αρχήν το integer part είναι γελοίο: float f = 123.456; int i = f; // ή αν θες γράψε και (int)f απο κει και πέρα, αν θέλεις το float part ως έχει μπορείς να κάνεις το απλό float r = f - i; έχοντας υπόψη ότι μετά από όλα αυτά ισχύει το όχι αναμενόμενο i + r != f γιατί η αριθμητική floating point δεν είναι άπειρης ακρίβειας. Αν θέλεις το r ( ~= 0.456 ) να το πάρεις σε string "456" θα δυσκολευτείς και επιπλέον μπορεί να μην είναι καν δυνατόν να το πάρεις σαν "456" εκτός και αν ξέρεις από κάπου εκ των προτέρων το πόσα δεκαδικά ψηφία είχε αρχικά. Σου προτείνω να δεις τι κατάλληλες συναρτήσεις μπορεί να υπάρχουν στη C standard library του compiler σου.
Timonkaipumpa Δημοσ. 20 Σεπτεμβρίου 2011 Δημοσ. 20 Σεπτεμβρίου 2011 Για να καταλάβω... Το πρόβλημά σου είναι εκπαιδευτικό; Δηλαδή θες να μάθεις το πώς; Έχεις πρόβλημα σε θέμα ταχύτητας υπολογισμού, γιατί έχεις επεξεργαστή με μικρή ισχύ και χωρίς DSP; Έχεις θέμα μεταφοράς και θες να μικρύνεις το μέγεθος των πακέτων; Τι; Εάν είναι εκπαιδευτικό, μία χαρά απάντησε ο def... αλλά στα άλλα, "κάτι λείπει"
migf1 Δημοσ. 21 Σεπτεμβρίου 2011 Δημοσ. 21 Σεπτεμβρίου 2011 #include <math.h> double fmod(double x, double y); double modf(double x, double *iptr); ΥΓ. Δες και τις παραλλαγές τους για float και long double
maniac89 Δημοσ. 21 Σεπτεμβρίου 2011 Μέλος Δημοσ. 21 Σεπτεμβρίου 2011 βασικά δουλεύω στο μετά-εργαλείο flex(λεξική ανάλυση) και έλεγα μήπως υπάρχει καμιά συνάρτηση κατευθείαν στην C που αν διαχωρίζει πραγματικό από ακέραιο μέρος. Το θέλω για να κάνω τις μετατροπέςαπό δυαδικό σε δεκαδικό, από δεκαεξαδικό σε δεκαδικό κτλ. π.χ. 0B1001.10011 σε δεκαδικό! >int y; int comma=0; int i,length; float total=0; int k=0; while(yytext[comma]!='.') { comma++; } printf("%d ",comma); if((yytext[0]=='0') && ((yytext[1]=='b') || (yytext[1]=='B'))) { length=strlen(yytext); /* vriskw to mhkos tis statheras */ /* kanw ta dyo prwta psifia, pou mou deixnoun se ti morfi einai o arithmos,mhdenika,wste na mou meinei o arithmos pou akolouthei */ yytext[0]='0'; yytext[1]='0'; i=atoi(yytext); /* string to integer */ y=i; for(k=0;k<(comma-2);k++) { i%=10; /* apomonwnw ta psifia */ total+=(i*pow(2,k)); y/=10; i=y; } for(i=0;i<comma;i++) { yytext[i]='0'; } yytext[comma]='1'; comma++; i=atoi(yytext); length-=comma; y=i; while (length>0) { i%=10; printf("%d ",i); total+=(i*pow(2,-length)); y/=10; i=y; length--; } }
migf1 Δημοσ. 21 Σεπτεμβρίου 2011 Δημοσ. 21 Σεπτεμβρίου 2011 Γράφαμε μαζί, δες τα links στο προηγούμενο post μου. Όσο για τις μετατροπές, ρίξε μια ματιά σε αυτό το προγραμματάκι που είχα φτιάξει παλαιότερα σε ένα άλλο φόρουμ: http://ideone.com/JhYXW (ενδεχομένως να σε βοηθήσει ).
maniac89 Δημοσ. 21 Σεπτεμβρίου 2011 Μέλος Δημοσ. 21 Σεπτεμβρίου 2011 ok,θα το ελένξω ευχαριστω πολύ όλους σας!
παπι Δημοσ. 21 Σεπτεμβρίου 2011 Δημοσ. 21 Σεπτεμβρίου 2011 βασικά δουλεύω στο μετά-εργαλείο flex(λεξική ανάλυση) και έλεγα μήπως υπάρχει καμιά συνάρτηση κατευθείαν στην C που αν διαχωρίζει πραγματικό από ακέραιο μέρος. Το θέλω για να κάνω τις μετατροπέςαπό δυαδικό σε δεκαδικό, από δεκαεξαδικό σε δεκαδικό κτλ. π.χ. 0B1001.10011 σε δεκαδικό! #include <stdio.h> >int main(int ,char**) { int i1,i2; sscanf("0B1001.10011","%x.%x",&i1,&i2); printf("%d.%d",i1,i2); return 0; }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.