Seite 1 von 1

Wert aufteilen

Verfasst: 9. Oktober 2008 13:19
von Qt-nator
Hi,

ich hab eine Division die immer wieder kommt mit nur einem Veränderten Wert in einer Schleife.

x / 64 = x.x

So jetzt möchte einmal nur die Vorkommastelle und einmal nur die stellen nach dem Komma.

Nur bei meinem Ansatz stimmt das noch nicht so ganz.

Code: Alles auswählen


    for(int y = 0; y <= imgImage.height() -1; y++)
    {    
      for(int x = 0; x <= imgImage.width() -1; x++)
      {
        double dDiv = imgImage.width() / nCount;

        double dSegmentNumberAndK = x / dDiv;

        QString strValue = QString::number(dSegmentNumberAndK);
  
        QStringList list1 = strValue.split(".");

        QString strSegment = list1.first();

        QString strK = "0." + list1.last();

        int  nSegment = strSegment.toInt();      

        double dK = strK.toDouble();
    }

Könnte mir da jemand sagen was ich falsch mache bzw. was eine Bessere lösung wäre.

Gruß

Qt-nator

Verfasst: 9. Oktober 2008 18:25
von upsala
String-Funktionen für ein mathematisches Problem? Diese Aufgabe kann man sogar lösen wenn man die bereitgestellten Funktionen der math.h nicht kennt...

Verfasst: 10. Oktober 2008 10:07
von Qt-nator
ist gut... war vorschnell gestellt die Frage. Ich hatte einfach zu viel im Kopf und um die Ohren als das ich auf die einfache lösung gekommen bin.

Trotzdem danke

Verfasst: 10. Oktober 2008 10:36
von CaptnChaos

Code: Alles auswählen

#include<stdio.h>
#include <iostream>
#include <stdlib.h>
#include <cmath>

using namespace std;
#define BIAS 127

union bitsFl
{
	float fl;
	struct
	{
		unsigned char bits[4];
	};
};

int dshift(char byte, char s1, char s2)
{
	return (((byte>>s1)&0x01)<<s2);
}
char nshift(char byte, char s1)
{
	return ((byte>>s1)&0x01);
}

int main(int argc, char *argv[])
{
	bitsFl bfl;
	char *pEnd;
	float fl; 
	char byte = 3;
	char shift = 7;
	char cnt = 0;
	cout << "Float eingeben: ";
	cin >> fl;
	bfl.fl = fl;
	int sign = 0, exp = 0, dec = 0;
	unsigned long long kom;
	sign = dshift(bfl.bits[byte], 7, 0);
	shift--;
	cnt = 7;
	while(cnt >= 0)
	{
		exp |= dshift(bfl.bits[byte], shift, cnt);
		//cout << (int)nshift(bfl.bits[byte], shift);
		shift--;
		cnt--;
		if(shift < 0)
		{
			shift = 7;
			byte--;
		}
	}
	exp -= BIAS;
	
	//cout << endl;
	cnt = exp-1;
	dec = (1<<(cnt+1));
	while(cnt >= 0)
	{
		dec |= dshift(bfl.bits[byte], shift, cnt);
		//cout << (int)nshift(bfl.bits[byte], shift);
		shift--;
		cnt--;
		if(shift < 0)
		{
			shift = 7;
			byte--;
		}
	}
	//cout << endl;
	cnt = 23-exp;
	double tmp = 0; 
	while(cnt >= 0)
	{
		tmp += (1/pow(2.0, (double)((23-exp)-cnt)+1))*(double)nshift(bfl.bits[byte], shift)*pow(10.0, (double)exp+2);
		//cout << (int)nshift(bfl.bits[byte], shift);
		shift--;
		cnt--;
		if(shift < 0)
		{
			shift = 7;
			byte--;
		}
	}
	kom = (unsigned long long)tmp;
	
	cout << endl << "Float : " << fl << endl;
	cout << endl << "Exponent : " << (int)exp << endl;
	cout << endl << "Dezimalzahl : " << (int)dec << endl;
	cout << endl << "Kommazahl : " << (long)kom << endl;
	return 0;
}
oder, wenn man den leser nicht verwirren will kann man auch modf benutzen.