Π ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΠΎΡΠ΅ΡΠ΅ΠΉ ΡΠΎΡΠ½ΠΎΡΡΠΈ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π²ΡΠ΅ ΡΠ΅ΠΆΠ΅, Π΅ΡΡΡ Π·Π°ΡΠ»ΡΠ³Π° ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² VCL. ΠΠ½Π°Ρ, Π²ΡΠ·ΠΎΠ²Ρ ΠΊΠ°ΠΊΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π³ΠΎ ΡΠ»ΠΎΠ²Π° FPU, ΠΎΠ½ΠΈ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠΈΠΌΠΈ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π΅ ΡΠ»ΠΎΠ²ΠΎ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ. Π Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ Π²Π΅ΡΡΠΈΡΡ Delphi ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°ΠΊΠΈΡ "ΠΎΠ±Π΅ΡΡΠΎΠΊ" Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π² ΡΠ°Π½Π½ΠΈΡ , ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΌ Π½ΠΎΠ²Π΅Π΅ Π²Π΅ΡΡΠΈΡ Delphi, ΡΠ΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ°Π½Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. ΠΠ΄Π΅ΡΡ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Delphi 2007.
ΠΠ»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ DLL ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° API-ΡΡΠ½ΠΊΡΠΈΡ LoadLibrary. Π ΠΌΠΎΠ΄ΡΠ»Π΅ SysUtils Π΄Π»Ρ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΠΎΠ±Π΅ΡΡΠΊΠ°, Π½Π°Π·ΡΠ²Π°ΡΡΠ°ΡΡΡ SafeLoadLibrary (Π»ΠΈΡΡΠΈΠ½Π³ 3.13).
ΠΠΈΡΡΠΈΠ½Π³ 3.13. Π€ΡΠ½ΠΊΡΠΈΡ SysUtils.SafeLoadLibrary{ SafeLoadLibrary calls LoadLibrary, disabling normal Win32 error message popup dialogs if the requested file can't be loaded. SafeLoadLibrary also preserves the current FPU control word (precision, exception masks) across the LoadLibrary call (in case the DLL you're loading hammers the FPU control word in its initialization, as many MS DLLs do) }
function SafeLoadLibrary(const Filename: string; ErrorMode: UINT): HMODULE;
var
OldMode: UINT;
FPUControlWord: Word;
begin
OldMode := SetErrorMode(ErrorMode);
try
asm
FNSTCW FPUControlWord
end;
try
Result := LoadLibrary(PChar(Filename));
finally
asm
FNCLEX
FLDCW FPUControlWord
end;
end;
finally
SetErrorMode(OldMode);
end;
end;
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π΅ ΡΠ»ΠΎΠ²ΠΎ FPU ΠΏΡΠΈ ΡΠ²ΠΎΠ΅ΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
Π ΡΡΠ½ΠΊΡΠΈΠΈ CreateADOObject (Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ ADODB) ΡΠΎΠΆΠ΅ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΈ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π΅ ΡΠ»ΠΎΠ²ΠΎ (Π»ΠΈΡΡΠΈΠ½Π³ 3.14).
ΠΠΈΡΡΠΈΠ½Π³ 3.14. Π€ΡΠ½ΠΊΡΠΈΡ CreateADOObject ΠΌΠΎΠ΄ΡΠ»Ρ ADODBfunction CreateADOObject(const ClassID: TGUID): IUnknown;
var
Status: HResult;
FPUControlWord: Word;
begin
asm
FNSTCW FPUControlWord
end;
Status :=
CoCreateInstance(ClassID, nil, CLSTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, Result);
asm
FNCLEX
FLDCW FPUControlWord
end;
if (Status = REGDB_E_CLASSNOTREG) then
raise Exception.CreateRes(@SADOCreateError)
else OleCheck(Status);
end;
ΠΠ΄Π΅ΡΡ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π΅ ΡΠ»ΠΎΠ²ΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ CoCreateInstance, ΡΠΎΠ·Π΄Π°ΡΡΠ΅ΠΉ Π‘ΠΠ-ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠΎ, ΡΡΠ΄Ρ ΠΏΠΎ ΡΠΎΠΌΡ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½ΠΈΠ³Π΄Π΅ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ CoCreateInstance ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ Π² ΡΠ°ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π² ΡΠ΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ADO-ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π·Π΄Π΅ΡΡ Ρ Π΅Π΅ ΠΏΠΎΠΌΠΎΡΡΡ.
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ Π·Π°ΡΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ Dialogs, Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ TCommonDialog.TaskModalDialog. ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ ΠΊ ΡΡΠΎΠΉ Π·Π°ΡΠΈΡΠ΅ Π³Π»Π°ΡΠΈΡ: "Avoid FPU control word change in NETRAP.dll, NETAPI32.dll, etc".
Π ΠΌΠΎΠ΄ΡΠ»Π΅ Windows ΠΎΡΠΎΠ±ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ CreateWindow ΠΈ CreateWindowEx, ΠΊΠΎΡΠΎΡΡΠ΅, Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΡΠΎΠΆΠ΅ Π±ΡΠ»ΠΈ Π·Π°ΠΌΠ΅ΡΠ΅Π½Ρ Π² Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ FPU. ΠΠΎΡ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΈΠΌΠΏΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ CreateWindowEx (Π»ΠΈΡΡΠΈΠ½Π³ 3.15).
ΠΠΈΡΡΠΈΠ½Π³ 3.15. ΠΠΌΠΏΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ CreateWindowEx ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ Windowsfunction _CreateWindowEx(dwExStyle: WORD; lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; external user32 name 'CreateWindowExA';
function CreateWindowEx(dwExStyle: DWORD; lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
var
FPUCW: Word;
begin
FPUCW := Get8087CW;
Result :=
_CreateWindowEx(dwExStyle, lpClassName, lpWindowName,
dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu,
hInstance, lpParam);
Set8087CW(FPUCW);
end;
ΠΠΎΠ΄ΡΠ»Ρ Windows ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ CreateWindowExA ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ user32.dll, Π½ΠΎ Π΄Π°Π΅Ρ Π΅ΠΉ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ Π½Π΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π΅Π΅ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ Π΄ΡΡΠ³ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ CreateWindowEx (ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ CreateWindowExA), ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±Π΅ΡΡΠΊΠΎΠΉ Π½Π°Π΄ Π½Π°ΡΡΠΎΡΡΠ΅ΠΉ CreateWindowExA ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π³ΠΎ ΡΠ»ΠΎΠ²Π° FPU. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΡΡΡ ΠΈ Unicode-Π²Π°ΡΠΈΠ°Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ Π²ΡΠ·ΠΎΠ² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° CreateWindowEx Π² Π»ΡΠ±ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅Π ΠΌΠΎΠ΄ΡΠ»Π΅ Windows ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ Π΄Π΅ΡΠ°Π»Ρ: ΡΡΠ½ΠΊΡΠΈΠΈ CreateWindowA ΠΈ CreateWindowW ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ user32.dll ΡΡΠΈΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡΡΡΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠ±Π΅ΡΡΠΊΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ _CreateWindowExA ΠΈ _CreateWindowExW, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ ΠΈΠΌ 0 Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° dwExStyle.
3.2.12. ΠΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΡΠΏΡΠΈΠ»ΠΎΠ½
ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡΠΌΠΈ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΡΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠ°ΠΊΠΎΠΉ ΠΏΠ°ΡΠ°Π΄ΠΎΠΊΡ. ΠΡΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΡ ΡΡΠΈΡΠ°Π΅ΠΌ Ρ ΡΠΎΡΠ½ΠΎΡΡΡΡ Π΄ΠΎ ΡΡΠ΅Ρ Π·Π½Π°ΡΠ°ΡΠΈΡ ΡΠΈΡΡ. ΠΡΠΈΠ±Π°Π²ΠΈΠΌ ΠΊ ΡΠΈΡΠ»Ρ 1,00 ΡΠΈΡΠ»ΠΎ 1,00Ξ10-4. ΠΡΠ»ΠΈ Π±Ρ Π²ΡΠ΅ Π±ΡΠ»ΠΎ ΡΠ΅ΡΡΠ½ΠΎ, ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π±Ρ 1,0001. ΠΠΎ Ρ Π½Π°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π° ΡΠΎΡΠ½ΠΎΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Ρ ΠΎΠΊΡΡΠ³Π»ΡΡΡ Π΄ΠΎ ΡΡΠ΅Ρ Π·Π½Π°ΡΠ°ΡΠΈΡ ΡΠΈΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ 1,00. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠΈΡΠ»Ρ ΠΌΡ ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, Π±ΠΎΠ»ΡΡΠ΅Π΅ Π½ΡΠ»Ρ, Π° Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΈΠ·-Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΡΠΈΡΠ»ΠΎ. ΠΠ°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π΅Π³ΠΎ ΠΊ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ Π΄Π°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π½Π΅ ΡΠ°Π²Π½ΡΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅, Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ°ΡΠΈΠ½Π½ΡΠΌ ΡΠΏΡΠΈΠ»ΠΎΠ½.
ΠΠΎΠ½ΡΡΠΈΠ΅ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΡΠΏΡΠΈΠ»ΠΎΠ½ Ρ Π½ΠΎΠ²ΠΈΡΠΊΠΎΠ² Π½Π΅ΡΠ΅Π΄ΠΊΠΎ ΠΏΡΡΠ°Π΅ΡΡΡ Ρ ΠΏΠΎΠ½ΡΡΠΈΠ΅ΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ ΡΠΈΡΠ»Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ Π² Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅. ΠΡΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΡΠΏΡΠΈΠ»ΠΎΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΠΌΠ°Π½ΡΠΈΡΡΡ, Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΠ·-Π·Π° ΡΠ΄Π²ΠΈΠ³Π° ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΡ.
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΈΡΠΊΠ°ΡΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΡΠΏΡΠΈΠ»ΠΎΠ½ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎ, ΠΏΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ Π½Π°ΠΉΡΠΈ Π΅Π³ΠΎ ΠΈΠ· ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΡΠ°ΠΊ, ΠΌΠ°Π½ΡΠΈΡΡΠ° ΡΠΈΠΏΠ° Extended ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 64 ΡΠ°Π·ΡΡΠ΄Π°. Π§ΡΠΎΠ±Ρ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΡ, ΡΡΠ°ΡΡΠΈΠΉ Π±ΠΈΡ ΠΌΠ°Π½ΡΠΈΡΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°Π²Π΅Π½ 1 (Π΄Π΅Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Π°Ρ Π·Π°ΠΏΠΈΡΡ), ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π±ΠΈΡΡ β Π½ΡΠ»Ρ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π΅ ΠΈΠ· ΡΠΈΡΠ΅Π», Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ x > 1, ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ°ΠΌΡΠΉ ΠΌΠ»Π°Π΄ΡΠΈΠΉ Π±ΠΈΡ ΠΌΠ°Π½ΡΠΈΡΡΡ ΡΠΎΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π΅Π½ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅, Ρ.Π΅. Ρ = 1,00...001 (Π² Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ, ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΡΠΊΠΎΠΉ ΠΈ ΠΌΠ»Π°Π΄ΡΠ΅ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ΠΉ 62 Π½ΡΠ»Ρ). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΡΠΏΡΠΈΠ»ΠΎΠ½ ΡΠ°Π²Π½ΠΎ Ρ -1, Ρ.Π΅. 0.00...001. Π Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΠ²ΡΡΠ½ΠΎΠΉ Π΄Π΅ΡΡΡΠΈΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ 2-63, Ρ.Π΅. ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 1,084Ξ10-19.
ΠΠΈΡΡΠΈΠ½Π³ 3.16 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΡΡΠΎ ΡΠΈΡΠ»ΠΎ (ΠΏΡΠΈΠΌΠ΅Ρ Epsilon Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅).
ΠΠΈΡΡΠΈΠ½Π³ 3.16. ΠΠΎΠΈΡΠΊ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΡΠΏΡΠΈΠ»ΠΎΠ½procedure TForm1.Button1Click(Sender: TObject);
var
R: Extended;
I: Integer;
begin
R := 1;
while 1 + R/2 > 1 do R := R / 2;
Label1.Caption := FloatToStr(R);
end;
ΠΠ°ΠΏΡΡΡΠΈΠ² ΡΡΠΎΡ ΠΊΠΎΠ΄, ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½Π° ΡΠΊΡΠ°Π½Π΅ 1.0842021724855Π-19 Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π½Π°ΡΠΈΠΌΠΈ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π²ΡΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅Π ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , Π³Π΄Π΅ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ ΠΎΠΏΠΈΡΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΡΠ½ΠΎΡΡΠΈ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ΄Π°ΡΡ 2.22044604925031Π-16. ΠΡΠ»ΠΈ Π²Ρ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ Ρ ΡΠ΅Π±Ρ ΡΡΠΎ ΡΠΈΡΠ»ΠΎ, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Ρ FPU Π² ΡΠ΅ΠΆΠΈΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΠΈ.
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠΈΠΏ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ R Ρ Extended Π½Π° Double. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ. ΠΠ° Single β ΠΎΠΏΡΡΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ. ΠΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π»ΠΈΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΡΡΠ°Π½Π½ΡΠΌ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ 1 + R / 2 > 1. ΠΡΠ°ΠΊ, Π²ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅) ΡΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΡΠΈΠΏΠ° Extended. ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΡΠ°ΠΊΠΎΠ²Π°: ΡΠΈΡΠ»ΠΎ R Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡ ΡΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΊ ΡΠΈΠΏΡ Extended. ΠΠ°Π»ΡΡΠ΅ ΠΎΠ½ΠΎ Π΄Π΅Π»ΠΈΡΡΡ Π½Π° 2, Π° Π·Π°ΡΠ΅ΠΌ ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅ΡΡΡ 1, ΠΈ Π²ΡΠ΅ ΡΡΠΎ Π² Extended, Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π² Single ΠΈΠ»ΠΈ Double Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. ΠΠ°ΡΠ΅ΠΌ ΡΡΠΎ ΡΠΈΡΠ»ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΡΡΡ Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ΠΉ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° R, Ρ.ΠΊ. Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π΄Π°ΠΆΠ΅ ΡΠΈΠΏΠ° Single Π²ΠΏΠΎΠ»Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΡΠΏΡΠΈΠ»ΠΎΠ½.
3.2.13. ΠΠ΅ΡΠΎΠ΄Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ
ΠΠΎΠ΄Π²Π΅Π΄Π΅ΠΌ ΠΈΡΠΎΠ³ΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ. ΠΠ½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ, ΠΌΠΎΠ³ΡΡ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΡ , Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎ ΠΏΡΠΎΡΡΠΎΠΌ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠΈ. ΠΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π½Π°ΡΡΠ½ΡΡ ΡΠ°ΡΡΠ΅ΡΠ°Ρ ) ΡΡΠΎ Π½Π΅ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Ρ.ΠΊ. ΡΠ°ΠΌ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ°ΡΡΠ΅ΡΠ° Π΄Π°Π΅Ρ Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΡΡ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΡ. ΠΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ ΡΠ°ΠΌ, Π³Π΄Π΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π²ΡΠ²Π΅ΡΡΠΈ ΡΠΈΡΠ»ΠΎ Π½Π° ΡΠΊΡΠ°Π½ ΠΈΠ»ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ Π΅Π³ΠΎ Ρ Π΄ΡΡΠ³ΠΈΠΌ. Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΠ΅ΠΏΡΠΎΠ² Π½Π° Π²ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΆΠΈΠ·Π½ΠΈ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, Π½ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠΈΡΡΠ°ΡΠΈΡΡ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΎΠ²Π΅ΡΡ:
β‘ ΠΡΠ»ΠΈ Π²Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° β ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ "ΠΊΡΠ°ΡΠΈΠ²ΠΎΠ΅" ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΡΠ»Π° Π½Π° ΡΠΊΡΠ°Π½Π΅, ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ FloatToStr Π·Π°ΠΌΠ΅Π½ΡΠΉΡΠ΅ Π½Π° Π΅Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΎΠ³ FloatToStrF ΠΈΠ»ΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Format β ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠΊΠ°Π·Π°ΡΡ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΏΠΎΡΠ»Π΅ ΡΠΎΡΠΊΠΈ.
β‘ Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π²Π΅ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠΈΡΠ΅Π» ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΠΈ, Ρ.Π΅. Π²ΠΌΠ΅ΡΡΠΎ if Π° = b β¦ ΠΏΠΈΡΠ°ΡΡ if Abs(Π° - b) < ΠΡs β¦, Π³Π΄Π΅ Eps β Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ Π²Π΅Π»ΠΈΡΠΈΠ½Π°, Π·Π°Π΄Π°ΡΡΠ°Ρ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΡ (Π² ΠΌΠΎΠ΄ΡΠ»Π΅ Math, Π½Π°ΡΠΈΠ½Π°Ρ Ρ Delphi 6, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ SameValue, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠΎ ΠΆΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΠ°ΠΊ if SameValue(a, b, Eps) β¦).