[C++] Accuratie compiler aanpassen

Pagina: 1
Acties:

  • Iska
  • Registratie: November 2005
  • Laatst online: 24-06 18:01

Iska

In case of fire, use stairs!

Topicstarter
Hey allemaal,

Ik ben bezig met een programma dat werkt met priemgetallen. Het probleem is echter dat ik in plaats van het hele getal (bijv dit getal 15485863) het volgende als output krijg wanneer ik het getal omzet naar een char: 1.54858E7. Daar heb ik dus niets aan :S
Ik gebruik de volgende 2 methodes voor de output:
C:
1
2
sprintf(sTemp,"%G",this->dPrimeArray[this->dPrimeCounter]);
cout << "Next prime found: " << dTempCount << "\n";

Is er een manier om ervoor te zorgen dat ik altijd gewoon het volle getal te zien krijg (of op zijn minst een getal of 30)?

-- All science is either physics or stamp collecting


  • zzattack
  • Registratie: Juli 2008
  • Laatst online: 18-07 12:11
Jazeker, zorg dat je iostream include en stuur dan std::setprecision(30) naar std::cout.

  • Iska
  • Registratie: November 2005
  • Laatst online: 24-06 18:01

Iska

In case of fire, use stairs!

Topicstarter
Je bent geweldig :D

-- All science is either physics or stamp collecting


  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

cout en sprintf door elkaar? kies!

maar jouw vraag:

http://stackoverflow.com/...-for-large-numbers/265284

%G gebruik ik nooit maar is juist om wetenschappelijke notitatie te kijrgen.


PS: kijk ook eens naar "long long int " en/of een bignumber library als je verder wilt.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

leuk_he schreef op donderdag 27 augustus 2009 @ 15:26:
cout en sprintf door elkaar? kies!
Onzin. Goed, ik zou ook gewoon een stringstream gebruiken als ik ergens van een string moest maken, maar het is onzin dat je iostreams en printf functies niet door elkaar kunt gebruiken.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • jmzeeman
  • Registratie: April 2007
  • Laatst online: 10-07 22:43
30 getallen gaat je niet lukken zonder er andere libraries bij te halen en dat is niet alleen een probleem van laten zien. Bij 2^52 (= ongeveer 16 getallen) gaat de double namelijk precisie verliezen en krijg je in een keer verkeerde resultaten bij het berekenen van priemgetallen aangezien je niet meer kan zien of er wat overblijft bij een deling omdat de laatste getallen er gewoon niet meer zijn. (In theorie zou het per ongeluk nog even goed kunnen gaan als je compiler je variabelen nooit tussentijds uit de FPU registers haalt, deze zijn vaak iets groter(ik meen 82-bit bij x86) als de grootte van een float in je geheugen)

Een double is dus uberhaupt niet heel geschikt om een priemgetal in op te slaan aangezien een priemgetal altijd een integer is waar alle getallen significant zijn en je dus niks hebt aan de floating point en je dus 12 bits gewoon weggooit. Kies liever een 64-bit integer (2^64 = ongeveer 20 getallen) of nog beter een bignumber library.

[ Voor 14% gewijzigd door jmzeeman op 27-08-2009 16:30 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 00:56
jmzeeman schreef op donderdag 27 augustus 2009 @ 16:21:
In theorie zou het per ongeluk nog even goed kunnen gaan als je compiler je variabelen nooit tussentijds uit de FPU registers haalt, deze zijn vaak iets groter(ik meen 82-bit bij x86) als de grootte van een float in je geheugen
Die zijn 80 bits, waarvan de mantissa 64 bits bedraagt (wat effectief 65 bits pecisie oplevert); dan ben je dus nog nauwelijks beter af dan wanneer je gewoon een 64-bits integer zou gebruiken. Met geluk hoeft het overigens niet veel te maken te hebben als je je variabelen met type long double definieert. ;) (Overigens is dat geen standaard datatype, maar het wordt wel breed ondersteund.)

Overigens kun je met printf() ook prima het gewenste resultaat bereiken door de %f conversion specifier te gebruiken, eventueel met precisie van 0 als je alleen gehele getallen wil printen:
C:
1
printf("%.0f\n", 123456789.0);

[ Voor 30% gewijzigd door Soultaker op 27-08-2009 17:14 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

jmzeeman schreef op donderdag 27 augustus 2009 @ 16:21:
(ik meen 82-bit bij x86) als de grootte van een float in je geheugen)
80 bits voor de hele float, 65 effectieve bits voor de mantissa alleen. Maar dan moet de FPU wel in full mode draaien.

.edit: laat.
Soultaker schreef op donderdag 27 augustus 2009 @ 17:08:
[...]

(Overigens is dat geen standaard datatype, maar het wordt wel breed ondersteund.)
Long double is weldegelijk een standaard type. Alleen onder VC++ is een long double net zo groot als een double, dus dan schiet je er niet zoveel mee op.

[ Voor 41% gewijzigd door .oisyn op 27-08-2009 17:15 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 00:56
.oisyn schreef op donderdag 27 augustus 2009 @ 17:12:
Long double is weldegelijk een standaard type. Alleen onder VC++ is een long double net zo groot als een double.
Ik bedoelde dat het niet gestandaardiseerd is hoeveel precisie je krijgt met long double. :) (Dat staat wel vast voor gewone floats en doubles toch, of ook niet?)

Maar als VC++ geen extended precisie support is die ondersteuning trouwens toch niet zo gebruikelijk als ik dacht...

  • bobo1on1
  • Registratie: Juli 2001
  • Laatst online: 18-05 17:57
Er is een goede kans dat een 64 bit integer groot genoeg is, voor je daar een wrap mee krijgt ben je toch al een aantal uur aan het rekenen.

Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 18-06 11:36
Soultaker schreef op donderdag 27 augustus 2009 @ 17:15:
[...]
Ik bedoelde dat het niet gestandaardiseerd is hoeveel precisie je krijgt met long double. :) (Dat staat wel vast voor gewone floats en doubles toch, of ook niet?)

Maar als VC++ geen extended precisie support is die ondersteuning trouwens toch niet zo gebruikelijk als ik dacht...
Long double is tenminste 64 bits. Double zelf is ook tenminste 64 bits. Float is tenminste 32 bits.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
Ik heb ook ooit met priem getallen gewerkt, maar omdat deze zo snel al zo groot worden gebruikte ik de GMP library. Deze verliest nooit precisie, maar is wel een stuk langzamer.
Pagina: 1