-
1. Data: 2010-12-05 10:22:19
Temat: Algorytm konwersji ciągu znaków na liczbę zmiennoprzecinkową
Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
Witam!
Zastanawiam się, w jaki sposób napisać konwerter ciągu znaków na liczbę
zmiennoprzecinkową (float lub double). Mam kilka prostych, narzucających
się pomysłów, ale największym problemem każdego z nich jest duża liczba
obliczeń, z których każde może wprowadzać dodatkowy błąd numeryczny. Czy
macie jakieś pomysły na zrealizowanie tego zagadnienia z możliwie
największą dokładnością? Potrzebuję też umieć deterministycznie
stwierdzić, że dana liczba - choć zapisana poprawnie - jest nieprawidłową
liczbą zmiennoprzecinkową, na przykład 1e20000.
Aha - interesuje mnie *algorytm*, proszę więc nie proponować żadnych
gotowych funkcji.
Pozdrawiam -- Spook.
--
! ._______. Warning: Lucida Console sig! //) !
! || spk || www.spook.freshsite.pl / _ """*!
! ||_____|| spook at op.pl / ' | ""!
! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '!
! |_|[]_|_| May the SOURCE be with you! \/) \ !
-
2. Data: 2010-12-05 10:38:08
Temat: Re: Algorytm konwersji ciągu znaków na liczbę zmiennoprzecinkową
Od: Mariusz Marszałkowski <m...@g...com>
On 5 Gru, 11:22, "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
wrote:
> Aha - interesuje mnie *algorytm*, proszę więc nie proponować żadnych
> gotowych funkcji.
Dlaczego nie zrobić tego naturalnie tylko szukać
jakis algorytmow? Np. tak:
double ch2d( const char *c ) {
double t = 0;
while( *c >= '0' && *c <= '9' ) {
t = (t * 10) + *c - '0';
c++;
}
if( *c == '.' ) {
c++;
double m = 10;
while( *c >= '0' && *c <= '9' ) {
t += (*c - '0') / m;
c++;
m *= 10;
}
}
return t;
}
-
3. Data: 2010-12-05 10:51:58
Temat: Re: Algorytm konwersji ciągu znaków na liczbę zmiennoprzecinkową
Od: zdumiony <z...@j...pl>
W dniu 2010-12-05 11:22, Wojciech "Spook" Sura pisze:
> Zastanawiam się, w jaki sposób napisać konwerter ciągu znaków na liczbę
> zmiennoprzecinkową (float lub double). Mam kilka prostych, narzucających
> się pomysłów, ale największym problemem każdego z nich jest duża liczba
> obliczeń, z których każde może wprowadzać dodatkowy błąd numeryczny. Czy
A czy jest jakiś algorytm poza kolejnym przeglądaniem od lewej i
mnożeniem przez 10?
-
4. Data: 2010-12-05 11:07:33
Temat: Re: Algorytm konwersji ciągu znaków na liczbę zmiennoprzecinkową
Od: Jacek Czerwinski <...@...z.pl>
W dniu 2010-12-05 11:51, zdumiony pisze:
> W dniu 2010-12-05 11:22, Wojciech "Spook" Sura pisze:
>> Zastanawiam się, w jaki sposób napisać konwerter ciągu znaków na liczbę
>> zmiennoprzecinkową (float lub double). Mam kilka prostych, narzucających
>> się pomysłów, ale największym problemem każdego z nich jest duża liczba
>> obliczeń, z których każde może wprowadzać dodatkowy błąd numeryczny. Czy
>
> A czy jest jakiś algorytm poza kolejnym przeglądaniem od lewej i
> mnożeniem przez 10?
Na chlopski rozum wczesniej czy pozniej sie to do tego sprowadzi.
Dyskutował bym, czy obie (ew. wszystkie trzy) trzymac w
calkowitoliczbowym akumulatorze. Na wspolczesnych CPU nie musi dac to
wzrostu szybkosci jak dawniej, ale dokladnosc 'zaokragleniowa' jest ok.
Cyfr dokladnych tez wiecej niz finalowa liczba double tej samej ilosci
bajtow wytrzyma.
-
5. Data: 2010-12-05 12:02:19
Temat: Re: Algorytm konwersji ciągu znaków na liczbę zmiennoprzecinkową
Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
Dnia 05-12-2010 o 11:51:58 zdumiony <z...@j...pl> napisał(a):
> W dniu 2010-12-05 11:22, Wojciech "Spook" Sura pisze:
>> Zastanawiam się, w jaki sposób napisać konwerter ciągu znaków na liczbę
>> zmiennoprzecinkową (float lub double). Mam kilka prostych, narzucających
>> się pomysłów, ale największym problemem każdego z nich jest duża liczba
>> obliczeń, z których każde może wprowadzać dodatkowy błąd numeryczny. Czy
>
> A czy jest jakiś algorytm poza kolejnym przeglądaniem od lewej i
> mnożeniem przez 10?
Oczywiście, że tak. Można na przykład spróbować skonstruować tą liczbę
binarnie na bazie danych zebranych z ciągu znaków. Tyle tylko, że jest to
rozwiązanie ciężkiego kalibru i wydaje mi się, że istnieje jakieś
prostsze. Ponadto im więcej operacji arytmetycznych będzie
przeprowadzanych w trakcie konwersji, tym więcej błędów numerycznych
wprowadzi się do wyniku i może się w rezultacie okazać, że "2.0e5"
zostanie skonwertowane na 1.999999216356e5, czego chciałbym uniknąć.
Oczywiście przykład nieco przesadzony, ale wcale nie tak nierealny, jak
się wydaje.
Pozdrawiam -- Spook.
--
! ._______. Warning: Lucida Console sig! //) !
! || spk || www.spook.freshsite.pl / _ """*!
! ||_____|| spook at op.pl / ' | ""!
! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '!
! |_|[]_|_| May the SOURCE be with you! \/) \ !
-
6. Data: 2010-12-05 12:08:37
Temat: Re: Algorytm konwersji ciągu znaków na liczbę zmiennoprzecinkową
Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
Dnia 05-12-2010 o 11:38:08 Mariusz Marszałkowski <m...@g...com>
napisał(a):
> On 5 Gru, 11:22, "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
> wrote:
>> Aha - interesuje mnie *algorytm*, proszę więc nie proponować żadnych
>> gotowych funkcji.
>
> Dlaczego nie zrobić tego naturalnie tylko szukać
> jakis algorytmow? Np. tak:
Dlatego, że każda operacja na liczbach zmiennoprzecinkowych wprowadza
błędy numeryczne do obliczeń. Może się okazać, że liczbę zapisaną w ciągu
znaków da się zapisać w postaci liczby zmiennoprzecinkowej bez błędów, ale
liczby powstałe w trakcie obliczeń będą miały te błędy i wynik nie będzie
dokładny.
Pozdrawiam -- Spook.
--
! ._______. Warning: Lucida Console sig! //) !
! || spk || www.spook.freshsite.pl / _ """*!
! ||_____|| spook at op.pl / ' | ""!
! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '!
! |_|[]_|_| May the SOURCE be with you! \/) \ !
-
7. Data: 2010-12-05 16:39:39
Temat: Re: Algorytm konwersji ciągu znaków na liczbę zmiennoprzecinkową
Od: Mariusz Marszałkowski <m...@g...com>
On 5 Gru, 13:08, "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
wrote:
> Dnia 05-12-2010 o 11:38:08 Mariusz Marszałkowski <m...@g...com>
> napisał(a):
>
> > On 5 Gru, 11:22, "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
> > wrote:
> >> Aha - interesuje mnie *algorytm*, proszę więc nie proponować żadnych
> >> gotowych funkcji.
>
> > Dlaczego nie zrobić tego naturalnie tylko szukać
> > jakis algorytmow? Np. tak:
>
> Dlatego, że każda operacja na liczbach zmiennoprzecinkowych wprowadza
> błędy numeryczne do obliczeń. Może się okazać, że liczbę zapisaną w ciągu
> znaków da się zapisać w postaci liczby zmiennoprzecinkowej bez błędów, ale
> liczby powstałe w trakcie obliczeń będą miały te błędy i wynik nie będzie
> dokładny.
To moze konwersje w dwie strony? Najpierw z tekstu na binarna, potem
z binarnej na tekst. Nastepnie w splupku odejmujesz tekstowe liczby od
siebie. Rozniece mnozysz np. przez 1000, znow konwertujesz na liczbe
binarna, po konwersji dzielisz przez 1000 i dodajesz do pierwszej
binarnej
:D
-
8. Data: 2010-12-05 17:44:39
Temat: Re: Algorytm konwersji ciągu znaków na liczbę zmiennoprzecinkową
Od: "Marcin 'Qrczak' Kowalczyk" <q...@k...org.pl>
On Dec 5, 1:08 pm, "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
wrote:
> > Dlaczego nie zrobić tego naturalnie tylko szukać
> > jakis algorytmow? Np. tak:
>
> Dlatego, że każda operacja na liczbach zmiennoprzecinkowych wprowadza
> błędy numeryczne do obliczeń.
Nie każda. Na przykład dodawanie, odejmowanie i mnożenie na liczbach
całkowitych w typie double w zakresie od -2^53 do 2^53 (dla typowej
reprezentacji double) są dokładne.