long double

0

Witam mam pewien problem, otóż mam użyć w programie obiektu klasy array dla 100 wartości typu long double i obliczyć 100!

#include<iostream>
#include<array>
#include<conio.h>

using namespace std;
const int Arsize = 101;
int main()
{
    array < long double, Arsize > tabarr;
    //tabarr[0]=1;
    //	cout<<tabarr[0];
    tabarr[ 1 ] = tabarr[ 0 ] = 1;
    for( int i = 2; i < Arsize; i++ )
    {
        tabarr[ i ] = i * tabarr[ i - 1 ];
        
    }
    for( int i = 0; i < Arsize; i++ )
         cout << i << "! = " << tabarr[ i ] << endl;
    
    
    getch();
    return 0;
    
}

Oto co się wyswietla:
0! = -0
1! = -0
2! = -0
3! = -2
4! = -2
5! = -3.10504e+231
6! = -3.18618e-058
7! = -1.35666e-166
8! = -1.35666e-166
9! = -9.05568e-072
10! = -2.13401e+142
11! = -9.31519e-192
12! = -4.72401e+175
13! = -2.5143e-031
14! = -4.57401e-143
15! = -6.07857e-192
16! = -6.07857e-192
17! = -3.9374e-146
18! = -1.00067e-048
19! = -2.14614e+116
20! = -1.06929e-274
21! = -2.02307e-071
22! = -2.9729e+249
23! = -1.98327e-081
24! = -2.32675e-292
25! = -2.14112e+064
26! = -8.51497e-122
27! = -2.52495e-247
28! = -6.25641e+261
29! = -3.79461e+150
30! = -2.38193e+083
31! = -8.00952e+051
32! = -8.00952e+051
33! = -2.5684e+082
34! = -2.16718e+145
35! = -4.14765e+245
36! = -5.35079e-267
37! = -3.48066e-164
itd.
natomiast gdy zmienie na typ
LONG LONG INT

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = -4249290049419214848
22! = -1250660718674968576
23! = 8128291617894825984
24! = -7835185981329244160
25! = 7034535277573963776
26! = -1569523520172457984
27! = -5483646897237262336
28! = -5968160532966932480
29! = -7055958792655077376
30! = -8764578968847253504
31! = 4999213071378415616
32! = -6045878379276664832
33! = 3400198294675128320
34! = 4926277576697053184
35! = 6399018521010896896
36! = 9003737871877668864
37! = 1096907932701818880

Uzywam dev c++4.9.9.2 Orwell update 5.62
Dodam że napisałem już na innym forum i powyższy kod nie działa tylko u mnie, tj inni sprawdzali i ich wyniki sa dobre.
Co może być przyczyną? Pozdrawiam

0

Jak wyobrazasz sobie upchniecie liczby

9332621544394415268169923885626
6700490715968264381621468592963
8952175999932299156089414639761
5651828625369792082722375825118
5210916864000000000000000000000
000

do jakiegokolwiek prymitywnego typu liczbowego?

0

100! składa się ze ze 158 cyfr (w zapisie dziesiętnym) - to nie ma szans zmieścić się w long double.
Uprzedzając następne pytania:
1.Nie, nie istnieje taki prymityw (liczbowy), który dałby radę to obsłużyć.
2.GMP.

0

Rozumiem, takie miałem zadanie w ksiązce ;)
Ale program powinien przynajmnie obliczac dobrze pierwsze wartości aż do wartości która nie mieści się w danym typie tak jak w Long long int.
Jak widac program dobrze liczy do pewnego momentu. A jesli typ jest long double wyniki sa złe od początku!
Pytam więc dlaczego? PS jak już pisałem u innych ww kod działał dobrze, oczywiście do pewnego momentu. Tylko u mnie działa źle.

0

Bo nie przypisujesz typu double tylko typ int.

http://ideone.com/QN1JKO

0

n0name przeciez to jest dokładnie ten sam kod co ja wysłałem. Ale u mnie działa źle. Gdzie przypisuje typ int zamiast typu double?

0

Przyjrzyj się ponownie kodowi @n0name_l...

0

Chodzi o linkijke

 tabarr[ 1 ] = tabarr[ 0 ] = 1.;
0

Hah zauważyłem, w życiu bym się nie zorientował. Niestety u mnie działa tak samo nawet z 1. :(

0

Zaktualizuj kompilator i/lub środowisko.

0

Proponujesz code blox? Bo już przyzwyczaiłem się do deva, a chyba nowszej wersji Orwella nie ma...

0

Według mnie lepiej użyć Visual Studio. Środowisko preferowane przez system Windows, ponadto jak ci się znudzą konsole to możesz bez problemu przejść do okienek (chodzi mi tutaj o kreatory).

0

Witam mam problem z odjęciem od siebie dwóch liczb long double jedna ma dużo cyfr około 4930 druga mało około 4 istnieje jakaś funkcja?? tak jak % też nie działa a można to zastąpić z math.h funkcją modl(x,y)

0

Jak potrzebujesz dokładność do jedności to musisz użyć własnej reprezentacji dużych liczb lub użyć jakieś biblioteki których pełno w sieci.

0

no właśnie co do jedności musi być już wiem jak nawet wyświetlać <iomanip> cout<<setprecision(ilość wyświetlanych cyfr). Szukałem w math.h na przykład ale nie znalazłem jakieś propozycje macie gdzie to znajdę dzielenie i mnożenie idzie a dodawanie i odejmowanie nie /:

0

Hmm Bigint słyszałem o tym ale mi ptrzebna funkcja odejmująca long double bo program już mam napisany i sprawdziłem że nie działa tylko te odejmowanie :/ a z tym Bigint trzeba będzie przebudować program co? Niestety nie znam angielskiego.

0

13th dragon uczysz programowania?? Potrzebowałbym żeby ktoś nauczył mnie obsługi długich liczb biblioteka Boost. Zainstalować to na linux i nauczyć się dodawać odejmować dzielić mnożyć i reszta z dzielenia pierwiastkowanie do tego zapis tego i odczyt plik tekstowy. Zapłacę a lekję chciałbym przez gg czy skaypa pisemnie

0

Niestety nie znam angielskiego.

To sie go naucz, zanim zaczniesz myslec o programowaniu 'na serio'.

0

Ja proponuje ci to zrobić samemu, czegoś się nauczysz.
Zapamiętuj wynik w tablicy np vector<unsigned int>. Każda komórka tablicy niech reprezentuje 6 kolejnych cyfr wyniku, którą w algorytmie będziesz traktował jak jedną cyfrę w systemie, gdzie podstawą będzie 1000000. Potem robisz mnożenie pisemne przez jedną cyfrę (bo silnie będziesz liczył zapewne maksymalnie dla 200 co się mieści w tym 1000000).
Jak zaczniesz pisać to okaże się, że możenie pisemne długiej liczby przez jedną cyfrę jest banalnie proste.
Samo wypisanie wyniku też będzie proste bo każda komórka jest już prosto reprezentowana w systemie dziesiętnym.

0

Nie jestem jakimś zawodowym programistą interesują mnie matematyczne zagadki pracuję właśnie nad rozwiązaniem pewnej więc żeby angielskiego się na siłę uczyć to nie wiem czy jest sens. Taką fynkcję pewnie! bez problemu napisze tylko to będzie od bidy bo nie wierze że ktoś wcześniej nie napisał czegoś takiego mający większą wiedzę progrsmistyczną i robiąc to optymalniej np przy pomocy wstawek asemblerowych czy coś. Gdzieś coś czytałem chyba google mi przetłumaczyło z angielskiego żeby tego dokonać najsprawniej trzeba zamienić te long double na binarne i je binarnie dodać albo odjąc a napisanie czegoś takiego już jest dla mnie za trudne teoretycznie zrozumiałe ale nie znam na tyle C++a. Myśle jednak że na pewno jest gdzieś taka funkcja i to nie jedna. Więc trzeba się pytać może ktoś coś pamięta i pomoże ;)

0

Angielski to podstawa. Poza tym zalamuje rece, jezeli chodzi o twoje podejscie do sprawy. Od razu uszykuj pieniadze dla kogos kto to zrobic dla Ciebie, takie moje osobiste odczucie.

0

ech.. tam mówię przecież nie jestem zawodowym programistą programowanie jest właśnie stworzone z taką zasadą że aby zjeść jabłko nie trzeba wcale mieć sadu :D żeby korzystać z funkcji wcale nie trzeba analizować jak ktoś to zrobił. Nie wiem czemu jesteś załamany moim podejściem po prostu działam na dużych liczbach odejmuje jedną od drugiej jak zwykły typ np. int i kompilator nie wyświetla mi nie skompiluje ci tego d***u poczytaj o tym i o tym tylko kompiluje a nie liczy poprawnie to mnie zadziwia ;/ a tak w ogóle to zapłacę z chęciom za nauczenie obsługi dużych liczb i programowania wielowątkowego za pomocą biblioteki Boost i to chce wiedzieć niewiele do swoich potrzeb ale chętnych nie ma

0

jestem chetny, godzinowa stawka 100 euro. Mozemy sie uczyc o czym chcesz :) Fakture tez wystawie jak bedziesz chcial.

Jezeli stawka Ci nie pasuje, no to coz... mozesz czekac na innych lub samemu sie nauczyc

0

100 euro to drogo chociaż jak bym miał pewność że nauczę się wszystkiego co chcę przez godzinę to może się kiedyś umówimy. w sumie miałem kupić tą pozycję bo jej nie mam ale wydawała mi się ta książka trudną lekturą ja mam to http://helion.pl/ksiazki/opinie/cpprim.htm naprawdę od podstaw można się wszystkiego dowiedzieć i świetne ćwiczenia programistyczne po skończonych rozdziałach

0

Nie wiem czy ten temat to troll, ale zycze powodzenia mimo wszystko ;p

0

plik odejmij.h

#ifndef  ODEJMIJ_H_
#define ODEJMIJ_H_
#include<fstream>
#include<iomanip>
using namespace std;
long double od(long double x,long double y)
{short a=0,b=-2,z,z1,z2; char c; bool d=1,e;long double r;
if(y<=x)e=0;else e=1; 
ofstream plik; plik.open("plik.txt"); plik<<setprecision(3000);
plik<<x<<endl<<y; plik.close();
fstream plik1; plik1.open("plik.txt");
while(!plik1.eof())
{plik1.get(c);if(c=='\n')d=0;
if(d)a++;else b++;} plik1.close();
plik1.open("plik.txt");
if(e){short*tabw = new short[a];
      short*tab1 = new short[a];
      short*tab2 = new short[b];
for(int l=0;l<a;l++){tabw[l]==0; 
plik1.get(c);tab1[l]=c-48;}plik1.get(c);
for(int l=0;l<b;l++){plik1.get(c); 
tab2[l]=c-48;}
z=b-a;z1=b;z2=a;
for(int l=0;l<z2;l++,b--,a--){tabw[b-1]=tab2[b-1]-tab1[a-1];
if(tabw[b-1]<0){tabw[b-1]+=10;tab2[b-2]-=1;}}
for(int l=0;l<z;l++,b--){if(tab2[b-1]<0){
if(10==tabw[b-1]+10)tabw[b-1]=+9;else tabw[b-1]=+10;tab2[b-2]-=1;}
else tabw[b-1]=tab2[b-1];}
ofstream plik2; plik2.open("plik.txt");
for(int l=0;l<z1;l++){plik2<<tabw[l];}
plik2.close();
fstream plik3; plik3.open("plik.txt");
plik3>>r;plik3.close();
return r;}
else {short*tabw = new short[b];
      short*tab1 = new short[b];
      short*tab2 = new short[a];
for(int l=0;l<a;l++){tabw[l]==0;
plik1.get(c);tab2[l]=c-48;}
plik1.get(c);
for(int l=0;l<b;l++){plik1.get(c); 
tab1[l]=c-48;}
z=a-b;z1=a;z2=b;
for(int l=0;l<z2;l++,b--,a--){tabw[a-1]=tab2[a-1]-tab1[b-1];
if(tabw[a-1]<0){tabw[a-1]+=10;tab2[a-2]-=1;}}
for(int l=0;l<z;l++,a--){if(tab2[a-1]<0){
if(10==tabw[a-1]+10)tabw[a-1]+=9;else tabw[a-1]+=10;tab2[a-2]-=1;}
else tabw[a-1]=tab2[a-1];}
ofstream plik2; plik2.open("plik.txt");
for(int l=0;l<z1;l++){plik2<<tabw[l];}
plik2.close();
fstream plik3; plik3.open("plik.txt");
plik3>>r;plik3.close();
return r;}}
#endif

Napisałem funkcję long double=od(long double,long double)
można teraz odejmować jeszcze zrobię dodawanie i jeszcze jakąś funkcję bym musiał dodać żeby kasowało plik tekstowy który otwiera i zamyka funkcja plik.txt.

0

Dla mnie liczy się to że działa nie musi to ładnie pachnieć taki mam styl minusy może takie że ciężko poprawić coś ale co tam poprawiać skoro działa. Dobrze że skończyłem tego samego dnia bo na drugi dzień albo się pochlastać albo zacząć pisać od nowa no to bym ort! pisać od nowa :D

Konkursu na najbardziej nieczytelny kod cpp który daje się skompilować bym nie wygrał. A teraz zobaczyłem te formatowanie na tej stronce obcina niektóre linijki uważajcie w razie czego na kopiowanie kodu. Chyba że tak mi się to wyświetla teraz tu na komórce np. Na początku long double i r; mam już w następnej linijce

0

ja tylko dodam, że w niektórych kompilatorach long double to to samo co double...

#include <stdio.h>
int main()
{
	printf("sizeof(double) == %d\n", sizeof(double));
	printf("sizeof(long double) == %d\n", sizeof(long double));
}
C:\PP\myprogs\cpp>gcc longdouble.cpp -o longdouble.exe

C:\PP\myprogs\cpp>longdouble.exe
sizeof(double) == 8
sizeof(long double) == 12

C:\PP\myprogs\cpp>cl longdouble.cpp /nologo
longdouble.cpp

C:\PP\myprogs\cpp>longdouble.exe
sizeof(double) == 8
sizeof(long double) == 8

C:\PP\myprogs\cpp>

1 użytkowników online, w tym zalogowanych: 0, gości: 1