Pereiti prie turinio

C++ programavimo kalba


Rekomenduojami pranešimai

Sveiki,

 

Gal kas galit pagelbėti su C++ kalba? Rašau programėlę, kuri dirba su mažais skaičiais, tokiai kaip 10^-57. Parašiau kodą su Visual C++, jis puikiai veikia, bet bandant perrašyti su C++ Builder iškyla problemos. Kadangi turiu double tipo masyvą, o man reikia string, aš skaičius (masyvas S[][]) konvertuoju į eilutę

 

std::ostringstream sstream;

sstream <<fixed<<setprecision(100)<< S[m][j];

std::string eilute = sstream.str();

 

dabar šioje vietoje jeigu spausdinu iš karto ir eilute, ir S[m][j], gaunu skirtingus ats. Nuo 10^-37 string gauna daug nulių, masyvas rašo normalias reikšmes, iki 10^-37 abu rašo gerai.

 

Gal yra kažkoks kitas būdas perkonvertuoti? Gali būti per ilgas stringas? Visual čia problemos nerado.

Naudojant FloatToStr() gaunu gerą atsakymą, bet gaunu AnsiString, o man reikia paprasto string, kad galėčiau taikyti find_first_not_of. Yra tokios funkcijos atitikmuo AnsiString? Blogiausiu atveju galiu for ciklą rašyti ir pasidaryti tą find, bet tikiuosi,kad yra protingesnis būdas

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki,

 

Gal kas galit pagelbėti su C++ kalba? Rašau programėlę, kuri dirba su mažais skaičiais, tokiai kaip 10^-57. Parašiau kodą su Visual C++, jis puikiai veikia, bet bandant perrašyti su C++ Builder iškyla problemos. Kadangi turiu double tipo masyvą, o man reikia string, aš skaičius (masyvas S[][]) konvertuoju į eilutę

 

std::ostringstream sstream;

sstream <<fixed<<setprecision(100)<< S[m][j];

std::string eilute = sstream.str();

 

dabar šioje vietoje jeigu spausdinu iš karto ir eilute, ir S[m][j], gaunu skirtingus ats. Nuo 10^-37 string gauna daug nulių, masyvas rašo normalias reikšmes, iki 10^-37 abu rašo gerai.

 

Gal yra kažkoks kitas būdas perkonvertuoti? Gali būti per ilgas stringas? Visual čia problemos nerado.

Naudojant FloatToStr() gaunu gerą atsakymą, bet gaunu AnsiString, o man reikia paprasto string, kad galėčiau taikyti find_first_not_of. Yra tokios funkcijos atitikmuo AnsiString? Blogiausiu atveju galiu for ciklą rašyti ir pasidaryti tą find, bet tikiuosi,kad yra protingesnis būdas

Labas,

Visų pirma yra tam skirta visai atskira skiltis :)

Antra, float tipo kintamieji visad turės paklaidų, dėl apvalinimo. Ypač jei atlieki daug skaičiavimų.

Trečia, VS C++ compileris turi savo "pričindalų" tikslumui bei optimizacijai dirbant su float tipo kintamaisias :)

Redagavo Zylius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Atsiprašau dėl skilties, man tai asocijavos su mokslais, todėl čia ir dėjau ir aišku perkelt nežinau jau kaip :D

 

bet kodėl man apvalina, jeigu double eina iki 10^-308, neperžengiu tokių ribų.

Kuo skaičius toliau nuo 0, tuo jo paklaida yra didesnė tiek float, tiek double.

 

Normaliomis sąlygomis double niekada nebus pakankamai tikslus, kad galėtų sutalpinti savyje 100 skaičių po kablelio (dėl to ir atsiranda tie nuliai arba devynetai), todėl patariu tą 100 tiesiog sumažinti iki protingos reikšmės, pavyzdžiui 52 arba 23.

Redagavo nagisa
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dabar neprisimenu, kiek vietos yra skiriama mantisei ir kiek eilei nurodyti, bet paaiškinsiu kaip saugomas float tipo skaičius. Float yra tas pats integer, tik jis turi priskirta tam tikrą skaičių bitų eilei nurodyti. Struktūra yra tokia:

| 1 bitas mantisės ženklui | n bitų mantisei | 1 bitas eilės ženklui | m itų eilei | (mantisės duomenys gali eiti ir po eilės duomenų).

Taigi, mantisė saugo patį skaičių, o eilė saugo tą ∙10a. Todėl, matyt, pas tave į mantisę telpa tik tiek skaičių, kad galėtum atvaizduoti iki ∙10-37.

 

Su double lygiai tas pats, tik kad mantisei ir eilei skirta daugiau bitų.

 

Tau, šiuo atveju, manau pačiam teks pasirašyti klasę, kuri saugotų tokį skaičių. Pasiimsi kelis int tipo kintamuosius (man atrodo geriausia būtų imti unsigned int). Kelis priskiri mantisei, eilei užteks vieno. Dar du kintamuosius pasirenki ženklams saugoti. Kadangi tau reikia iki ∙10-57, o unsigned int turi 9 skaitmenis neskaitant pirmojo (nuo 0 iki 4294967296), tai reikėtų 57 ÷ 9 ≈ 7 kintamūjų mantisei.

 

Kitas variantas bandyti skaičių saugoti keliuose double tipo kintamuosiuose, nes (a + b)÷c = a÷c + b÷c. Tik čia reikia irgi apmąstyti viską, kaip perkelsi liekaną nuo vieno kintamojo prie kito ir panašiai.

 

Čia truputis apie slankiojo kablelio skaičius, gal kartais rasi ir sau tinkamo dydžio skaičių tipą.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Faktorialams skaičiuoti dažnai naudoju string tipo masyvą, kai visi normalūs skaičių tipai pasiduoda. Tik tuomet skaičių sumos/skirtumo/dalmens/daugybos formules turėsi pats pasirašyt, bet tai tikrai nėra sunku.

Faktorialo (nors čia tik funkcija, tad atlieka realiai tik daugybos veiksmus):

void faktorialas (string & str, long long n) //str - tas didelis skaičius, n - iš kokio skaičiaus dauginama
{
long long minty = 0;
int t;
for (int i = str.size()-1; i >= 0; i--)
{
 t = str[i]-'0';
 t = t*n+minty;
 minty = t/10;
 str[i] = t%10+'0';
}
reverse (str.begin(), str.end());
while (minty > 0)
{
 str += minty%10+'0';
 minty = minty/10;
}
reverse (str.begin(), str.end());
}

Redagavo Paulius
Nuoroda į pranešimą
Dalintis kituose puslapiuose
Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...