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

διαχωρισμός float number


maniac89

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

Δημοσ.

έχω έναν αριθμό κινητής υποδιαστολης π.χ. το 814.615?

υπάρχει κάποια συνάρτηση που να κάνει split ώστε να παίρνω

σε δύο ακέραιες μεταβλητές π.χ.i=814 και y=615

ή πρέπει να το προγραμματίσω?

ευχαριστώ πολύ!!

Δημοσ.

Συνάρτηση δεν μπορώ να σου πω γιατί δεν ξέρω σε ποια γλώσσα αναφέρεσαι (μάλλον αυτό εννοεί και ο defacer).

 

Αλγόριθμοι υπάρχουν. Ένας από αυτούς είναι να εκφράζεις το δεκαδικό μέρος με κάποια από τα bits του αριθμού και με τα άλλα τον αριθμό. Βέβαια, εκεί θα πρέπει να δεις το range που έχεις κτλ κτλ. Αλλά, εάν δεν έχεις πρόβλημα επεξεργαστικής ισχύος (ή/και μνήμης), τότε γιατί θες να μπλέξεις με fixed points;

Δημοσ.

α!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 σου.

Δημοσ.

Για να καταλάβω...

 

 

Το πρόβλημά σου είναι εκπαιδευτικό; Δηλαδή θες να μάθεις το πώς; Έχεις πρόβλημα σε θέμα ταχύτητας υπολογισμού, γιατί έχεις επεξεργαστή με μικρή ισχύ και χωρίς DSP; Έχεις θέμα μεταφοράς και θες να μικρύνεις το μέγεθος των πακέτων; Τι;

 

Εάν είναι εκπαιδευτικό, μία χαρά απάντησε ο def... αλλά στα άλλα, "κάτι λείπει" :P

Δημοσ.

βασικά δουλεύω στο μετά-εργαλείο 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--;
		}
	}

Δημοσ.

Γράφαμε μαζί, δες τα links στο προηγούμενο post μου.

 

Όσο για τις μετατροπές, ρίξε μια ματιά σε αυτό το προγραμματάκι που είχα φτιάξει παλαιότερα σε ένα άλλο φόρουμ: http://ideone.com/JhYXW (ενδεχομένως να σε βοηθήσει ;) ).

Δημοσ.

βασικά δουλεύω στο μετά-εργαλείο 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;
}

 

 

grin.png

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...