Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.048 c
2-1179101593
Gringoire
2007-05-14 04:13
2007.06.03
Запрос SQL


15-1178373658
Poed
2007-05-05 18:00
2007.06.03
В Турбо паскале не создается исполняемый файл!


2-1179381387
Oleg_teacher
2007-05-17 09:56
2007.06.03
Фильтрацыя


8-1148998595
TGX
2006-05-30 18:16
2007.06.03
Вопрос связаный с Flash.


6-1158036070
DelphiN!
2006-09-12 08:41
2007.06.03
Отключить кеширование при открытии страницы в TWebBrowser-e





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский