Форум: "Прочее";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
ВнизОкругление Найти похожие ветки
← →
P (2007-05-11 03:56) [0]Вопрос. Какое округление можно считать стандартным, когда говорят об округлении - банковское/гаусово (до ближайшего четного) или арифметическое (до ближайшего целого, с включением 0.5).
← →
Германн © (2007-05-11 05:12) [1]
> P (11.05.07 03:56)
>
> Вопрос. Какое округление можно считать стандартным
Стандартов есть много. И стандартных округлений тоже :(
← →
TUser © (2007-05-11 09:30) [2]Смотря кто говорит.
← →
Kolan © (2007-05-11 09:35) [3]Имхо в Delphi банковское стандартное.
← →
Megabyte © (2007-05-11 09:37) [4]Ну если вспомнить математику, то до ближайшего целого вроде(0.5 уже в большую сторону) :)
← →
TUser © (2007-05-11 09:37) [5]По умолчанию, - да, но это легко можно поменять.
← →
ZeroDivide © (2007-05-11 09:41) [6]То округление которое в Delphi, по разному округляет на разных компьютерах т.к. зависит от реализации конкретного сопроцессора. На сайте Borland где-то лежит исходник "независимого" округления. А стандартов действительно много.
← →
MBo © (2007-05-11 10:05) [7]>То округление которое в Delphi, по разному округляет на разных компьютерах т.к. зависит от реализации конкретного сопроцессора.
Да ну???
Округление зависит от установленного кодового слова сопроцессора.
← →
VICTOR_ (2007-05-11 10:37) [8]Если речь идет об учете (напр. оперативном(складском) или бухгалтерском), то стандартом есть
- 5 и выше - округляется вверх
- до 5 - округляется вниз.
То есть так как учили в школе. И соответственно будет это округление будет понятно обычному пользователю и он сможет при необходимости его проверить.
Но этот стандарт нигде не регламентирован. По крайней мере законодательной регламентации я не встречал.
← →
db2admin (2007-05-11 11:00) [9]P (11.05.07 03:56)
помойму стоит уточнить вопрос в какой прикладной области то округление?
← →
Правильный Вася (2007-05-11 11:40) [10]
> в какой прикладной области то округление?
в преферансе?
← →
Паша 1 (2007-05-11 11:53) [11]Дельфи к округлению никакого отношения не имеет. хотя, есть в модуле Math ф-ции для округления, но не знаю, насколько корректно работают. в четверке работали криво, если они там были, в пятерке не тестил.
> MBo © (11.05.07 10:05) [7]
мучился я как-то с этими установками. подробностей не помню, давненько было. но не помогло, возможно я шо-то неправильно делал. пришлось реализовывать ручками.
← →
ANB © (2007-05-11 12:01) [12]Кстати, никто не помнит примерчик, когда банковское округление отличается от обычного (математического) ?
Мне надо проверить нашу систему на эту проблему (нужно, чтобы работало обычное), а тест подобрать не могу - все время правильно круглит.
← →
MBo © (2007-05-11 13:03) [13]математическое (школьное) округление - 1.5 округляется к 2, 2.5 - к 3
бухгалтерское округление - 1.5 и 2.5 округляются к 2, как к четному (это уменьшает ошибки, набегающие при суммировании)
← →
ZeroDivide © (2007-05-11 13:36) [14]
> >То округление которое в Delphi, по разному округляет на
> разных компьютерах т.к. зависит от реализации конкретного
> сопроцессора.
>
> Да ну???
> Округление зависит от установленного кодового слова сопроцессора.
>
Да-да. Один и тот же экзешник на разных процах выдавал разные результаты :)
По сабжу
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1217
← →
Anatoly Podgoretsky © (2007-05-11 14:15) [15]> Megabyte (11.05.2007 09:37:04) [4]
Это математика у вас ограниченная была.
← →
Anatoly Podgoretsky © (2007-05-11 14:16) [16]> VICTOR_ (11.05.2007 10:37:08) [8]
У нас за подобное округление голову аудиторы оторвут.
← →
MBo © (2007-05-11 14:22) [17]>По сабжу
Там я не вижу указаний на то, что результат зависит от проца.
А вот если какая-то программа или подключенный модуль меняет кодовое слово (например, не исключено, что OLE-инициализация на разных системах может такое вытворять), а ведь Round, в отличие от , скажем, Trunc, не проверяет и не устанавливает кодовое слово, то разногласия могут быть. Кроме того, в приведенной табличке округляются не числа типа 1.5, имеющие точное двоичное представление, а,например, 0.0150, которое является приближенным (т.к. оно не выражается в виде N*2^M, где N, M - целые числа), поэтому я и не вижу пока что весомых доводов за то, что процы привирают.
← →
Anatoly Podgoretsky © (2007-05-11 14:28) [18]> MBo (11.05.2007 14:22:17) [17]
В Виндоус есть отдельные места, где меняется контрольное слово и не восстанавливается.
← →
alien1769 © (2007-05-11 14:51) [19]
> В Виндоус есть отдельные места, где меняется контрольное
> слово и не восстанавливается.
Это уже интересно. Можно источник ?
← →
ZeroDivide © (2007-05-11 14:55) [20]
> MBo © (11.05.07 14:22) [17]
>
> >По сабжу
> Там я не вижу указаний на то, что результат зависит от проца.
>
Так это по сабжу, а не потому как процы привирают.
>не вижу пока что весомых доводов за то, что процы привирают.
Один и тот же экзешник на разных процах выдавал разные результаты
Не довод?
> А вот если какая-то программа или подключенный модуль меняет
> кодовое слово
Программа запускалась одна и та же, во время ее запуска больше ничего не запускалось.
К сожалению не могу сказать какие точно процы, это было давно, но наблюдалось своими глазами, через Радмин на машине клиента.
← →
Anatoly Podgoretsky © (2007-05-11 15:04) [21]> alien1769 (11.05.2007 14:51:19) [19]
Источник форумы Борланд, информация была примерно лет 10 назад, от разработчиков Дельфи.
Если хочешь совершить подвиг, то подними архивы за все время существования их форумов :-)
← →
Anatoly Podgoretsky © (2007-05-11 15:04) [22]> ZeroDivide (11.05.2007 14:55:20) [20]
Не довод, если только ты не менял процессор на одной и той же машине.
← →
P (2007-05-11 15:21) [23]
> Германн © (11.05.07 05:12) [1]
>
>
> > P (11.05.07 03:56)
> >
> > Вопрос. Какое округление можно считать стандартным
>
> Стандартов есть много. И стандартных округлений тоже :(
Вспомнил что в России на ЕГЭ было задание округлить число, так шуму было...(метод округления был не указан).
← →
Однокамушкин (2007-05-11 15:54) [24]
> > В Виндоус есть отдельные места, где меняется контрольное
>
> > слово и не восстанавливается.
>
> Это уже интересно. Можно источник ?
По исходникам стандартных модулей погуглите. Вот выдержки из исходников в Delphi 7.
SysUtils.pas, строки 2904-2911{ 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 = SEM_NOOPENFILEERRORBOX): HMODULE;
Windows.pas, строки 30892-30937:function _CreateWindowEx(dwExStyle: DWORD; 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 _CreateWindowExA(dwExStyle: DWORD; lpClassName: PAnsiChar;
lpWindowName: PAnsiChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
stdcall; external user32 name "CreateWindowExA";
function _CreateWindowExW(dwExStyle: DWORD; lpClassName: PWideChar;
lpWindowName: PWideChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
stdcall; external user32 name "CreateWindowExW";
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;
function CreateWindowExA(dwExStyle: DWORD; lpClassName: PAnsiChar;
lpWindowName: PAnsiChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
var
FPUCW: Word;
begin
FPUCW := Get8087CW;
Result := _CreateWindowExA(dwExStyle, lpClassName, lpWindowName, dwStyle,
X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
Set8087CW(FPUCW);
end;
function CreateWindowExW(dwExStyle: DWORD; lpClassName: PWideChar;
lpWindowName: PWideChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
var
FPUCW: Word;
begin
FPUCW := Get8087CW;
Result := _CreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle,
X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
Set8087CW(FPUCW);
end;
Зачем-то люди сохраняют и восстанавливают управляющее слово FPU...
Модуль ADODB.pas, строки 1121-1138:function CreateADOObject(const ClassID: TGUID): IUnknown;
var
Status: HResult;
FPUControlWord: Word;
begin
asm
FNSTCW FPUControlWord
end;
Status := CoCreateInstance(ClassID, nil, CLSCTX_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;
Тоже зачем-то сохраняют и восстанавливают...
Dialogs.pas, строки 575-590:try
Application.HookMainWindow(MessageHook);
asm
// Avoid FPU control word change in NETRAP.dll, NETAPI32.dll, etc
FNSTCW FPUControlWord
end;
try
CreationControl := Self;
Result := TDialogFunc(DialogFunc)(DialogData);
finally
asm
FNCLEX
FLDCW FPUControlWord
end;
Application.UnhookMainWindow(MessageHook);
end;
Ну, тут прямо пишут, зачем сохраняют и восстанавливают.
Не первоисточник, конечно, но ведь зачем-то люди возятся с этим словом :))) А дыма без огня не бывает :)))
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.045 c