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í.
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