[c++] Större nummer än existerande datatyper?

Permalänk
Medlem

[c++] Större nummer än existerande datatyper?

Har suttit med c++ och byggt, byggt, byggt. Jag är till och med nöjd med resultatet och har lärt mig väldigt mycket under tiden.

Nu är jag dock fast. Mitt program läser från en fil, sedan sparar det datan i en databas. So far so good, när den läser in informationen hamnar den i olika strukturer av strängar. Det funkar bra med vägen från fil till databas.
Sedan ska jag hämta data från databasen, utföra lite enkel matematik (+, -, *, / och ev. %).
Dock så får inte talen plats i någon av de datatyper som finns (pga. bristande precision). Talen är max 15 siffror långa och 2 av dessa siffror är decimaler. Alltså;
1234567891234.56

Jag har googlat som en idiot och det jag hittar är GMP som verkar omnämnt på flera sidor. Har dock inte lyckats installera detta (Microsoft Visual C++ 2008 Express).
GMP verkar dock vara för gigantiska nummer. Kanske överflödigt?

En float i mitt system klarar 3,40282e+038, en double 1.79769e+308, så det är inte storleken på talen som är problemet utan precisionen.

Det känns inte som att jag är den enda med detta problemet? (även om det varit svårgooglat) Så, hur gör ni när ni arbetar med tal som inte passar in i de existerande datatyperna?

Mycket tacksam för alla svar!
//pscs3

Visa signatur

Cat funeral! Cat funeral!
>>> 112383 <<<

Permalänk
Glömsk

Hur gör du om flyttalet till en sträng innan du sparar ner den i databasen?

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Psionicist
Hur gör du om flyttalet till en sträng innan du sparar ner den i databasen?

Erhm... programmet är inte så avancerat eller roligt som det kanske låter.
Filerna är .txt, varje rad har olika kolumner med information, varje kolumn är separerade med ett kommatecken.
Jag har en struktur med de olika kolumnerna. Programmet läser rad för rad, om det inte är ett komma eller radbrytning lägger den till tecknet i en sträng.
Om det är ett kommatecken så kopierar den strängen till rätt plats i strukturen och kör en string.clear();, sedan börjar den om.
Är det en radbrytning så lägger den hela strukturen i en vektor av strukturen.

För databasen har jag byggt en klass som förenklar microsofts ODBC så jag skapar en sträng typ såhär:
string dbString = "INSERT INTO database.table(kol, kol2) VALUES(\"";
dbString += struktur.kol;
dbString += "\"";
dbString += struktur.kol2;
dbString += "\");";

Sedan matar jag in den i klassens "prepare"-funktion och kör med en "execute"-funktion.

Ungefär så! =P
//pscs3

Visa signatur

Cat funeral! Cat funeral!
>>> 112383 <<<

Permalänk

long double kanske eller en 64-bitars int där du alltid antar att de två sista siffrorna är decimaler.

Edit:
Talet såg inte så stort ut så jag testade hos mig (64bit Linux).

#include <iostream> int main() { std::cout<<"Size double: "<<sizeof(double)<<std::endl; std::cout<<"Size long double: "<<sizeof(long double)<<std::endl; double tal = 1234567891234.56; std::cout.precision(10); std::cout.setf(std::ios::fixed,std::ios::floatfield); std::cout<<"Stort tal (double): "<<tal<<std::endl; }

Resultat

Size double: 8 Size long double: 16 Stort tal (double): 1234567891234.5600585938

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Korkskruv
[...]

Så enkelt kan det vara!
På mitt system är lond double och double lika stora (8 bytes) och verkar ha 17 siffrors precision (prövat med 1234567891234.56789123456).

Tack så jättemycket för hjälpen!!

Visa signatur

Cat funeral! Cat funeral!
>>> 112383 <<<