Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF – vaše škola fotografie

 

Kdo lektoruje pražský letní workshop v ZOO a Botanické zahradě?

V dnešní soutěži hrajeme o:

Dárkový certifikát v hodnotě 1000 Kč



chyba v zaokrouhlování funkce sin,cos

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: chyba v zaokrouhlování funkce sin,cos

Autor: elvis

2:12:40 03.04.2010

ja som mal tiež problémy s real a extended pri FloatToStr napríklad a nie len tam. Double sa mi viac osvečil. niektoré tie chyby s real a extended boli veľmi nezmyselné.

Citovat příspěvek

 

Re: chyba v zaokrouhlování funkce sin,cos

Autor: 5527

12:06:34 13.01.2010

Funkce sin s pravděpodobností hraničící s jistotou dává na všech PC stejné výsledky, problém bude v nastavení přesnosti a zaokrouhlování v FPU Control World, prostě to někdo změnil. Zjisťuje se to Get8087CW a Set8087CW. Z hlediska přesnosti je nejlepší možný datový typ Extended.

Citovat příspěvek

 

Re: chyba v zaokrouhlování funkce sin,cos

Autor: kopy

7:14:55 05.11.2009

Jěště jsem chtěl dodat, že jsem zkusil použít vlastní sin funkci, se stejným výsledkem. Bohužel nemůžu na těch počítačích krokovat program, abych viděl co dělají, ale tipoval bych chybu ve výpočtu s čísli s desetinnou čárkou...

Kopy...

Citovat příspěvek

 

Re: chyba v zaokrouhlování funkce sin,cos

Autor: Kopy

7:00:14 05.11.2009

Floattostr je to první co mně napadlo. Vynásobil jsem výsledek a převedl ho přes IntToStr, a vše bylo stejné jako u FloatToStr...
Jinak to blbne i když pouziju místo Extended real...

Kopy...

Citovat příspěvek

 

Re: chyba v zaokrouhlování funkce sin,cos

Autor: kopy

6:55:42 05.11.2009

Ve floatToStr to neni. To bylo první co mne napadlo... Vynásobil jsem číslo a převedl přes InttoStr. Chyba se opakovala. Dokonce jsem použil vlastní definici fce sin, a zjistil, že i tam se chyba projevuje,jako kdyby při výpočtu špatně zaokrouhloval.Na Jednom PC počítá správně, na jiném špatně...

Zatím je to pro mne záhada...

Kopy...

Citovat příspěvek

 

Re: chyba v zaokrouhlování funkce sin,cos

Autor: JaroB

8:07:47 03.11.2009

Musím říci, že jsem měl velké problémy s typem Extended, který se v určitých systémových funkcích měnil na Double a zpět (je dobré podívat se jak s parametry zachází různé funkce viz třeba FloatToStr). Nakonec jsem ho změnil na Double.
Pokud je potřeba opravdu velké přesnosti, pak je možné použít BCD aritmetiku, je obsažená, tuším, v klasickém balíku SysTools od TurboPowerSowtware "StBCD.pas", který byl uvolněn pod MPL v 1.1.

Citovat příspěvek

 

chyba v zaokrouhlování funkce sin,cos

Autor: kopy

6:19:32 03.11.2009

Dobrý den,
narazil jsem na poměrně zvláštní chybu u funkcí sin a cos. Stávalo se mi, že na některých PC funkce vraceli rozdílné výskedky. Hodnoty se začali lišit na cca 5 desetinném místě. Po dalších analýzách jsem zjistil, že za všechno může funkce pro výběr složky.

při spuštění této funkce:
function VyberSlozku(Title:string):string;
var
Buffer: array[0..MAX_PATH] of char;
Slozka: TBrowseInfo;
Items: PItemIDList;
VybranaSlozka:string;
begin
try
Slozka.hwndOwner:= GetActiveWindow;
Slozka.pidlRoot:= nil;
Slozka.pszDisplayName:= Buffer;
Slozka.lpszTitle:= PCHar(Title);
Slozka.ulFlags:= BIF_RETURNONLYFSDIRS;
Slozka.lpfn:= BrowserCallback;
Slozka.lParam:= Longint(TForm1);
Items:= shBrowseForFolder(Slozka);
if Assigned(Items) then
begin
shGetPathFromIdList(Items, @Buffer[0]);
VybranaSlozka := StrPas(Buffer);
if VybranaSlozka[length(VybranaSlozka)]<>'\' then VybranaSlozka:= VybranaSlozka + '\'
end;
finally
GlobalFreePtr(Slozka.pidlRoot);
Result:= VybranaSlozka;
end;
end;

začnou funkce sin a cos v programu vytvářet nepřesné výsledky. Vypadá to na nějakou zaokrouhlovací chybu..

function TForm1.GenS ( var Param: Extended; CyklN: integer ) :TFastReturnRndPole;
var
pomA,ParamSin: Extended;
strA,strB,strV: string;
begin
ParamSin:= Param + CyklN ;
pomA:= Abs( sin ( ParamSin ));
//---
strA:= floatToStr( pomA);

Edit2.Text:= FloatToStr( ParamSin) + ':' + strA ;
end;

při parametrech 660,6,517 je výsledek 0,478861539308989, což je správně, ale na některých pc to je 0,478861539309036 což je mi záhadou.

Neví někdo jak je to možné, nikde jsem nenalezl odpověď ani mne nenapadá jak se to dá
obejít. Program potřebuje vyšší přesnost těchto funkcí.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: