Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];

Вниз

Round(4.5) = 4, Round(5.5) = 6   Найти похожие ветки 

 
Ученик   (2002-11-06 14:45) [0]

По каким это правилам ?


 
LongIsland   (2002-11-06 14:48) [1]

Округление до четного - по-моему - бухгалтерия:-)


 
Андрей Прокофьев   (2002-11-06 14:48) [2]

X is a real-type expression. Round returns an Int64 value that is the value of X rounded to the nearest whole number. If X is exactly halfway between two whole numbers, the result is always the even number. This method of rounding is often called “Banker’s Rounding”.

см SimpleRoundTo


 
Ученик   (2002-11-06 14:51) [3]

>LongIsland © (06.11.02 14:48)
>Андрей Прокофьев © (06.11.02 14:48)
Спасибо

Нашел ссылку на рекомендацию IEEE, кто-нибудь в курсе ?


 
han_malign   (2002-11-06 14:51) [4]

По правилам сопроцессора округляется до ближайшего четного. (Вернее исходя из формата хранения вещественных чисел (Double(5.5)<>11/2)).


 
TTCustomDelphiMaster   (2002-11-06 14:53) [5]

Вроде уже не раз спрашивали. Правда с местным поиском найти что-то невозможно...

Связано это с финансами. Все что меньше Х,5 идет в один карман, что больше Х,5 в другой. А Х,5 чтобы никого не обидеть округляют так: четные к меньшему, нечетные к большему и все довольны и полный баланс :)


 
TTCustomDelphiMaster   (2002-11-06 15:57) [6]

Вот откапал:

DiamondShark © (23.08.02 14:04)
Э, нет. Бухгалтерским называется именно первый метод, т.е. вот такой:


1.5 -> 2
3.5 -> 4
2.5 -> 2
4.5 -> 4


Почему? Обясняю.

Рассмотрим набор чисел


1.0 1.0 0
1.1 1.0 -0.1
1.2 1.0 -0.2
1.3 1.0 -0.3
1.4 1.0 -0.4
1.5 ??? ????
1.6 2.0 +0.4
1.7 2.0 +0.3
1.8 2.0 +0.2
1.9 2.0 +0.1
2.0 2.0 0


Первый столбец -- точное число, второй -- округление, третий -- абсолютная ошибка. Легко заметить, что абсолютная ошибка зависит только от значности округления и не зависит от абсолютной величины числа.

А теперь представим, что нам надо считать сумму большого количества чисел, с распределением близким к равномерному, как обычно происходит на бухгалтерских счетАх.
Как видно, все погрешности (кроме 1.5 !) взаимно компенсируются (распределение равномерное). Если мы будем округлять Х.5 -> (X+1).0 или до (Х-1).0, то будет накапливаться систематическая ошибка.
Давайте прикинем, какого значения она может достичь.
Пусть N -- общее количество чисел.
Распределение близкое к равномерному, поэтому вероятность появления числа вида Х.5 -- 0.1
Абсолютная ошибка -- 0.5
Тогда мат. ожидание абсолютной ошибки суммирования N чисел N * 0.1 * 0.5 = N * 0.05

При суммировании к примеру 1000 значений с округлением до целого абсолютная погрешность может достигать 50.

Выход -- внести симметрию в вышеприведенную таблицу. Это и достигается округлением четных и нечетных чисел в разные стороны.

Вот потому иммено этот метод округления и называется "бухгалтерский", и именно его желательно применять в финансовых расчетах.

Вот пример: сумма чисел


точно | бухгалтерский | арифметический
1.5 2.0 2.0
3.5 4.0 4.0
2.5 2.0 3.0
4.5 4.0 5.0
---- ----- -----
12.0 12.0 14.0


Вопросы есть?

PS
кстати, в математическом сопроцессоре есть флажок, управляющий режимом округления (бухгалтерский или арифметический)


 
Ученик   (2002-11-06 16:53) [7]

>TTCustomDelphiMaster © (06.11.02 15:57)

Спасибо за флажок (начал поиск),

{ Project JEDI Code Library (JCL) }

type
T8087Rounding = (rcNearestOrEven, rcDownInfinity, rcUpInfinity, rcChopOrTruncate);

function Get8087ControlWord: Word; assembler;
asm
{$IFNDEF FPC}
SUB ESP, TYPE WORD
{$ELSE}
SUB ESP, $2
{$ENDIF}
FSTCW [ESP]
FWAIT
POP AX
end;

function Get8087Rounding: T8087Rounding;
begin
Result := T8087Rounding((Get8087ControlWord and $0C00) shr 10);
end;

function Set8087ControlWord(const Control: Word): Word; assembler;
asm
FNCLEX
FSTCW Default8087CW
XCHG Default8087CW, AX
FLDCW Default8087CW
end;

function Set8087Rounding(const Rounding: T8087Rounding): T8087Rounding;
var
CW: Word;
begin
CW := Get8087ControlWord;
Result := T8087Rounding((CW and $0C00) shr 10);
Set8087ControlWord((CW and $F3FF) or (Word(Rounding) shl 10));
end;


 
Ученик   (2002-11-06 16:55) [8]

>Ученик © (06.11.02 16:53)
SetRoundMode :-)


 
Ученик   (2002-11-06 17:33) [9]

>TTCustomDelphiMaster © (06.11.02 15:57)
>Ученик © (06.11.02 16:55)
>Ученик © (06.11.02 16:53)
С флажками нет ничего подходящего :(



 
Андрей Прокофьев   (2002-11-06 17:41) [10]

Ученик © (06.11.02 17:33)
см SimpleRoundTo
или не подходит?


 
Ученик   (2002-11-06 17:51) [11]

>Андрей Прокофьев © (06.11.02 17:41)
Подходит, но хотелось бы влиять на все Round, которые есть в своем коде, RTL, VCL



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
1-59229
Брат
2002-11-05 14:09
2002.11.18
Как проще всего скопировать директорию со всем её содержимым?


14-59329
Администратор
2002-10-30 23:39
2002.11.18
Back Systems Corp.


6-59304
VID
2002-09-22 21:32
2002.11.18
Чтиво про TServerSocket в режиме stThreadBlocking


3-59051
Felix
2002-10-30 10:21
2002.11.18
Inter Base


1-59275
Тори
2002-11-07 13:32
2002.11.18
написать программу





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский