Wert aufteilen

Verschiedenes zu Qt
Antworten
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Wert aufteilen

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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.
Antworten