long double

0

To kolego może wiesz dlaczego long double potrafi tak wielkie liczby przwchowywać za pomocą setprecision () można wyświetlić max 4932 cyfry to więcej niż 12 birów

0

Ależ skąd? Więcej niż 24 znaki nie przechowasz, te 4 tysiące będą przybliżone.

0

Kurcze jak przybliżone?? Jak liczy co do jedności np mnożąc. Weźmy np dwa long double pomnóżmy je w pętli i wynik zapisujmy do jednej z nich w końcu ta liczba urośnie maksymalnie do 4932 cyfr i dalej będzie inf wypisywać więc jak to możliwe że tylko 24 cufry są policzone dokładnie a reszta przybliżona. Tylko ja mówię o bibliotece <iomanip> i funkcji setprecision ()

1

A czy gdybym ci napisał ze 1/3 to jest 0,333... I dalej milion 3 to czy to by znaczyło ze faktycznie pamiętam takie długie rozwinięcie? Czy może jest przybliżone?

0

Rozumiem że liczba może być przybliżona jeśli chodzi o dzielenie chociaż można to przybliżenie ustalać to jak to się dzieje? Potrzebuję 1/3 i z liczby która jest jakoś przybliżona robi się liczba która np. ma 4932 cyfry :/ a zmienna niby ma 12 bajtów

3

Kurcze jak przybliżone??

Ano po prostu.

#include <stdio.h>
int main()
{
    long double d = 400000000000000000000.0L;
    printf("%Lf\n",d);
    printf("%Lf\n",d+1);
}

http://ideone.com/5sEqVm

400000000000000000000.000000
400000000000000000000.000000
0

Wiem co to przybliżenie ja nie wiem w jaki sposób na 12 bajtów można przechowywać liczby 4932 cyfrowe musi to zajmować więcej miejsca

0

Nie można na dwunastu bajtach*, ot co.
* no dobra, chyba że chcesz przechować liczbę, która składa się z jedynki i 4931 zer lub jakiejś podobnej kombinacji. Wtedy przykładowo robisz dwubajtową całkowitą mantysę i dziesięciobajtowy wykładnik, zatem maksymalnie zapiszesz liczbę 255 * 10^(2^10) (co jednak daje max 1027 cyfr; przy jedenastobajtowym wykładniku i jednobajtowej mantysie miałbyś 2051 cyfr. Możesz iść dalej i mieć np. mantysę składającą się z jednego nibble czy dwóch bitów, ale nie chce mi się już tego liczyć plus nie miałoby to raczej większego zastosowania :P).

2

ja nie wiem w jaki sposób na 12 bajtów można przechowywać liczby 4932

10^4931

właśnie ci na 7 bajtach zapisałem liczbę 4932-cyfrową.

0

No tak. Myslałem wcześniej że ten typ liczy tylko dla samego pokazanizania rzędu wielkości liczby czy też jaka liczba jest mała dlatego ten ten typ mnie nigdy nie interesował a to jak teraz to widzę da się wyświetlić taką dokładność co do jednoś to dla mnie nowość

0

a dowiedziałem się o tym tu bo bym do tej pory tego nie wiedział nie wiem czy oglądacie ten kurs można się czasem dowiedzieć ciekawych spraw:

0

poprawiona wersja odejmij.h

#ifndef  ODEJMIJ_H_
#define ODEJMIJ_H_
#include<fstream>
#include<iomanip>
#include <stdlib.h> 
//windows <cstdlib> ??
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();
system("rm plik.txt"); //windows system("del plik.txt"); ??
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();
system("rm plik.txt"); //windows system("del plik.txt"); ??
return r;}}
#endif 

kasuje ten plik.txt co się otwiera dla potrzeb przeliczania sprawdzi ktoś czy działa to na windowsie?

0

Jasne. Jak tylko przepiszesz to na wersje czytelną dla człowieka.

0

Hehe no to zajebisty masz kompilator wiesz bo ja raczej taki mam najprostszy który kompiluje kod cpp wtedy kiedy jest poprawnie napisany w tym języku ewentualnie w razie błędów wypisuje błędy w kodzie wiesz wypisuje liniję w której czegoś nie rozumie i takie tam D:D

Kurcze ale w sumie to nie jest taki głupi pomysł zrobić taki program który przekształca kod np. cpp na bardziej przejrzysty nikt na to wcześniej nie wpadł?? Troszkę roboty by było i dużo by było do ulepszania w takim programie w ogóle duży zasób wiedzy trzeba by mieć dużo więcej niż kolorowanie includów, wyrazów kluczowych i tych wszystkich wiecie o co mi chodzi. Jutro siadam do dodawania long double. Przydałaby się jeszcze taka funkcja gdzieś musze poszukać która zwraca prawdę jeśli kod kompilowany jest np na windowsie chyba już kiedyś coś gdzieś takiego widziałem .

0

Kurcze ale w sumie to nie jest taki głupi pomysł zrobić taki program który przekształca kod np. cpp na bardziej przejrzysty nikt na to wcześniej nie wpadł?

Są takie programy - szukaj pod kątem c++ beautifier.

w ogóle duży zasób wiedzy trzeba by mieć dużo więcej niż kolorowanie includów, wyrazów kluczowych i tych wszystkich wiecie o co mi chodzi

nah', wcale nie. To takie zadanie na średni poziom.

Jutro siadam do dodawania long double.

Ale szto?

long double a, b, c;
c = a+b;

Przydałaby się jeszcze taka funkcja gdzieś musze poszukać która zwraca prawdę jeśli kod kompilowany jest np na windowsie

http://stackoverflow.com/questions/142508/how-do-i-check-os-with-a-preprocessor-directive

0
long double a, b, c;
c = a+b;

Działa może na małych zmiennych ale jak wezmę setprecision (4932) i wczytam z pliku tak dużą liczbę mającą te 4932 cyfry to jak dodaje albo odejmuje tak normalnie np liczbę 4cyfrową to nie dodaje co do jedności

0

Więc nie pomieścisz tej liczby w long double. Koniec kropka.
Poczytaj o bignumach.

0

Czemu ludzie śpią na zajęciach z metod numerycznych? Myślałem że zrozumiałeś już po tym poście: http://4programmers.net/Forum/C_i_C++/232921-long_double?p=1053186#id1053186 ale jak widać ani trochę. Typy liczbowe są ograniczone i już. Cudów nie zdziałasz. Liczba bitów danego typu określa jednoznacznie ile różnych liczb można za jego pomocą przedstawić. Jak masz 64 bity to będzie to 264-1 i ani jednej liczby więcej, bo to są wszystkie możliwe kombinacje 0 i 1 na 64 bitach. Koniec, kropka.
Z faktu że liczby zmiennoprzecinkowe są kodowane jako mantysa*2cecha wynika też, że tylko część tych bitów idzie na określenie cyfr danej liczby a pozostałe idą na określenie jej "rozmiaru". To znaczy że za różne cyfry danej liczby odpowiada tylko i wyłącznie mantysa.

0

Jak nie pomieszcze jak mieszcze bez problemu ja naprawde dużo nie czaję w zasadzie nie potzebuję może tego zrozumieć choć wypadałoby. Dlamnie trzeba łopatologicznie żebym zrozumiał. Czyli jeszcze raz używam cpp do swoich zagadek do swoich potrzeb potrzebuje większych liczb dowiedziałem się że można wpisać do kodu <iomanip> i cout <<setprecision (np.4932albo więcejnp 30000) i tak na maksa jest 4932cyfry i teraz tak operacje mnożenia dzielenia reszty z dzielenia fmodl (a, b); albo sqrtl(a); z <math.h> to działa liczy nawet na tak dużych liczbach a odejmowanie i dodawanie nie działa dlatego napisałem funkcję. I liczy poprawnie sprawdzaliście w ogóle?

3

@Shalom
@Rev
@moderatorzy

Zglaszam watek do zamkniecia za niska tresc od autora. Nie ma sensu tego ciagnac.

0

Jak nie pomieszcze jak mieszcze bez problemu ja naprawde dużo nie czaję w zasadzie nie potzebuję może tego zrozumieć choć wypadałoby. Dla mnie trzeba łopatologicznie żebym zrozumiał. Czyli jeszcze raz używam cpp do swoich zagadek do swoich potrzeb potrzebuje większych liczb dowiedziałem się że można wpisać do kodu <iomanip> i cout<<setprecision (np.4932 albo 30000) i tak na maksa jest 4932cyfr teraz operacje mnożenia dzielenia reszty z fmodl (a,b); albo sqrtl(a); z <math.h> to działa liczy nawet na tak dużych liczbach a odejmowanie i dodawanie nie działa dlatego napisałem funkcję. I liczy poprawnie sprawdzaliście w ogóle?

1

Ani double, ani nawet long double tam gdzie jest obsługiwany, nie nadają się do twoich działań na liczbach 4932-cyfrowych.
Są specjalne biblioteki do dzałań na wielkich liczbach.

0

Wiem już chyba pisałem dobra jest ta biblioteka BOOST będę musiał się nauczyć obsługi długich liczb i programowania wielowątkowego bo mam 8rdzeni a wszystko mi na jednym idzie

Na razie jednak pobawie się na tym long double tak że jak ktoś chce jeszcze te dodawanie co dziś napisze to wstawie kodzik może się komuś kiedyś przyda

4

@Rebus wyjaśnię ci to łopatologicznie:
Liczba 4 bitowa ma 4 "miejsca" w które możesz wstawić 0 albo 1. To znaczy że możesz mieć
0001
0010
0011
...
1110
1111
Takich różnych możliwości jest dokładnie 24 = 16 (możesz policzyć jeśli nie wierzysz!)
To znaczy ze za pomocą 4 bitów możesz przedstawić 16 różnych liczb i ani jednej więcej, bo po prostu wyczerpałeś wszystkie możliwe opcje.
Liczba 64 bitowa działa dokładnie tak samo i może przedstawić 264 różnych liczb i ani jednej więcej.
Widzisz chyba że wynika z tego że nie da się w takim razie przechować tam liczb o długości 5000 cyfr dziesiętnych, skoro masz raptem "miejsce" na 64 cyfry binarne...

0

No ok to rozumiem 12 bajtów ma long double tak czyli 12*8bitów czyli wychodz 2^96 tak czyli jak się można domyślać ten setprecision () coś na bank musi manipulować zmieniać może dynamicznie (czy jakoś nie wiem) w zależności od potrzeb wielkość bitów tego typu napisze te dodawanie i przykłady z dodawaniem odejmowaniem i jak ktoś myśli że to nie możliwe to sobie będzie mógł sam sprawdzić czy do liczby która ma np te 4932cyfry nie uda się dodać czy odjąć jakiejś liczby i wyświetlić wynik wyświetlając long double.

1

Nie. setprecision działa inaczej. Wyobraź sobie, że w gazecie piszą, że wyremontowali drogę za 14 mln złotych polskich nowych. Zajefajnie. Ale idziesz na miejsce i stoi tam taka blacha, że dofinansowano to cuś ze środków unijnych i jest tam napisane, że kosztowało to 13 783 653,53 złotych polskich nowych. Ktoś coś tutaj kręci, czyż nie? Otóż istnieje coś takiego jak precyzja wyświetlania i tym właśnie jest setprecision.

No bardziej łopatologicznie wytłumaczyć chyba już nie można.

4

@winerfresh ale to autorowi nadal nie wyjaśnia czemu możesz mieć precyzje większą niż zakres typu liczbowego ;P
@Rebus wyobraź sobie że jesteś w stanie pamiętać tylko 5 cyfr i liczbę zer danej liczby. Więc możesz zapamiętać liczbę 123450000... niezależnie od tego ile będzie miała zer, ale liczby 123456 już nie zapamiętasz i będzie to dla ciebie po prostu 123450.
Teraz wyobraź sobie że mówie ci że coś kosztuje 12345zł ale chce żebyś wypisał to na 10 cyfrach, więc wypisujesz mi 12345.00000. A teraz mówie ci że coś kosztuje 1234500000 i że kupujesz do tego coś za 1zł. To by znaczyło że łączny koszt to 1234500001, ale możesz zapamiętać tylko 5 cyfr i zapamiętujesz te "ważniejsze" więc dla ciebie 1234500000 + 1 = 1234500000. Ale gdybym poprosił cię o wypisanie tego na 15 cyfrach to bez problemu podasz mi 1234500000.00000
Rozumiesz więc że ta "precyzja" to nie jest do końca tak....

0

Ilość bitów liczby determinuje ile różnych liczb można na tylu bitach zapisać, ale to nic nie mówi o tym, jakie to są liczby.
To zależy tylko od przyjętej konwencji, interpretacji tych bitów.

Przykładowo, na 4 bitach można zapisać szesnaście różnych wartości:
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
jeśli przyjmiemy, że są to liczby całkowite bez znaku, to przyjmują one kolejno wartości:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
jeśli to jest liczba ze znakiem w kodowaniu uzupełnieniowym do 2, znaczenie kolejnych liczb będzie takie:
0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1
oba formaty liczb są „precyzyjne”, ale różnią się zakresem: 0..15 albo -8..7

Liczby zmiennoprzecinkowe (float, double, long double) zapisywane są inaczej. Poczytaj jak.
Istotne jest, że mają określoną liczbę cyfr znaczących. Im mniejsza liczba, tym zapis jest precyzyjniejszy.
Na przykład mając 3 cyfry znaczące można zapisać 1,23 albo 1,24, więc „precyzja” wynosi tutaj 0,01.
Ale już różnica między 424000 a 425000 wynosi cały 1000, a to byłyby „kolejne”, sąsiadujące liczby przy takim zapisie.

0

Ok no nic macie racje to nie działa nie liczy poprawnie co do jedności tu jest jak ktoś chce poczytać po angielsku: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
:/ zmylił mnie ten filmik na youtube co wcześniej wstawiłem koleś wyliczał kolejne wyrazy ciągu fibonacciego i mówił że to jest co do jedności /:

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