Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизЯ В ШОКЕ. Стандарт округления в FPU Найти похожие ветки
← →
DevilDevil © (2012-06-29 10:43) [0]13 лет занимаюсь программированием на Delphi
и только сегодня я познал вещь, которую раньше даже не мог предположить
отдаю должное сишным i = (int)(X + 0.5)
Тестируйте:Caption := IntToStr(Round(12.5)) + " " + IntToStr(Round(13.5));
← →
antonn © (2012-06-29 10:45) [1]"банковское" округление?
← →
AV © (2012-06-29 10:51) [2]Заметили что только четные?
Caption := Format("%d %d %d %d %d %d %d %d", [Round(12.5), Round(13.5), Round(14.5), Round(15.5),
Round(16.5), Round(17.5), Round(18.5), Round(19.5)] );
о чем это может говорить? :)
← →
Inovet © (2012-06-29 10:51) [3]> [0] DevilDevil © (29.06.12 10:43)
> и только сегодня я познал вещь, которую раньше даже не мог предположить
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1217&mode=print
← →
DevilDevil © (2012-06-29 10:55) [4]я просто не думал что "банковское" округление заложено в FPU на уровне архитектуры !
я представить себе не мог
← →
Труп Васи Доброго © (2012-06-29 10:59) [5]
> 13 лет занимаюсь программированием на Delphi
> и только сегодня...
Мог бы и до пенсии не узнать, если бы ничего банковско-бухгалтерского не программировал. Округление оно бывает разным, в том числе и банковским.
← →
DevilDevil © (2012-06-29 11:01) [6]честно - я случайно увидел в этой статье http://habrahabr.ru/post/112953/
пункт 4.1
← →
AV © (2012-06-29 11:17) [7]
> "банковское" округление
почему его так называют..
логичное округление, что бы минимизировать нарастание погрешности.
Ну-ка этих бухов..
← →
Плохиш © (2012-06-29 16:13) [8]
> DevilDevil © (29.06.12 10:55) [4]
>
> я просто не думал что "банковское" округление заложено в
> FPU на уровне архитектуры !
Из справки
Hinweis: Die Funktionsweise von Round kann mit der Prozedur Set8087CW oder der Funktion SetRoundMode gesteuert werden.
← →
Плохиш © (2012-06-29 16:14) [9]Т.е. всё, как всегда, описано и документировано.
← →
Inovet © (2012-06-29 16:23) [10]> [8] Плохиш © (29.06.12 16:13)
Я-я, гештойрт.
← →
Плохиш © (2012-06-29 16:37) [11]
> гештойрт
гештёрт
← →
antonn © (2012-06-30 01:34) [12]
> Плохиш © (29.06.12 16:14) [9]
>
> Т.е. всё, как всегда, описано и документировано.
"Читать умеешь? а на каком языке - не важно, учится моментально" =)
← →
Думкин_ (2012-06-30 09:57) [13]Немецкий хороший язык. Дер лаппен из да. Ди зоне из хох. Варум из щен.
---
Боюсь, что для автора топика будет откровением, что и дети - не из капусты. Ой, не из Kohl.
← →
Думкин_ (2012-06-30 09:58) [14]Не варум, извиняюсь. Веттер.
← →
Andy BitOff © (2012-06-30 23:54) [15]
> Думкин_ (30.06.12 09:57) [13]
> Немецкий хороший язык.
Хороший язык тот, который хорошо знаешь.
← →
Думкин_ (2012-07-01 03:42) [16]> Andy BitOff © (30.06.12 23:54) [15]
Не обязательно.
← →
alexdn © (2012-07-01 09:38) [17]Тоже странно, последнее время считаю, что компьютер это ЭВМ.
← →
Inovet © (2012-07-01 09:41) [18]> [17] alexdn © (01.07.12 09:38)
> последнее время считаю, что компьютер это ЭВМ.
А до этого механической считал?
← →
alexdn © (2012-07-01 10:04) [19]> Inovet © (01.07.12 09:41) [18]
скорее к тому что все уверены что компьютер это прибор для смотрения фильмов, что это эвм уже забывать стали)..
← →
VICTOR_ (2012-07-02 13:19) [20]
> я просто не думал что "банковское" округление заложено в
> FPU на уровне архитектуры !
> я представить себе не мог
Я тоже, пока не осознал, что стандартные функции округления в Delphi - работают не так, как учат в школе (5 и больше - вверх, до 5 вниз). Пришлось в учетной системе использовать свои переписанные функции округления (формата отображения и т.д.), так как обычному пользователю (менеджеру/бухгалтеру) не пояснишь, почему округление 12,5 и 13,5 - дает разный результат.
← →
Inovet © (2012-07-02 14:44) [21]> [20] VICTOR_ (02.07.12 13:19)
> что стандартные функции округления в Delphi - работают не так, как учат в школе
Ты уверен, что твои работают так, как учат в школе?
← →
VICTOR_ (2012-07-02 15:16) [22]
> Ты уверен, что твои работают так, как учат в школе?
Работают так как я описал (5 и больше - вверх, до 5 вниз).
Тестовые примеры (в том числе описанные автором топика) работают успешно.
Замечаний от пользователей/менеджеров/бухгалтеров. Пока нет. В отличие от присутствовавших ранее постоянных вопросов - почему здесь 12, а здесь 14.
← →
Inovet © (2012-07-02 15:22) [23]> [22] VICTOR_ (02.07.12 15:16)
> Работают так как я описал (5 и больше - вверх, до 5 вниз).
Это понятно, но всегда ли так? Когда 1 раз из 1000 округлит неправильно, могут сразу не обратить внимания, могут совсем не заметить, но оно будет.
← →
VICTOR_ (2012-07-02 15:33) [24]Честно говоря такого теста, как описано на http://www.delphikingdom.com не проводил.
← →
Компромисс © (2012-07-02 15:34) [25]Если есть unit tests со всеми интересующими вариантами (например, от -3 до 3 с шагом 0.1), то можно спать спокойно
← →
Inovet © (2012-07-02 15:37) [26]> [24] VICTOR_ (02.07.12 15:33)
> такого теста, как описано на http://www.delphikingdom.com не проводил.
А как у тебя сделано?
← →
Inovet © (2012-07-02 15:44) [27]> [23] Inovet © (02.07.12 15:22)
> Когда 1 раз из 1000 округлит неправильно
В тесте у некоторых функций 1 раз на миллионы встречаются ошибки.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1218
← →
VICTOR_ (2012-07-02 17:03) [28]Не претендуя на истину в последней инстанции
function Power10(Exponent:Integer):Extended;
asm
FLD1
CALL FPower10
end;
function RoundFloat(Val:Extended; AfterComa:Integer):Extended;
var
C:Double;
begin
if (AfterComa<0) then AfterComa := 0
else if AfterComa>15 then AfterComa := 15;
C := Power10(AfterComa);
Result := Val*C;
if Result>0 then Result := Result+0.5 else
if Result<0 then Result := Result-0.5;
Result := Int(Result)/C;
end;
← →
Inovet © (2012-07-02 17:56) [29]> [28] VICTOR_ (02.07.12 17:03)
Это с ошибками работает, насколько помню.
← →
Inovet © (2012-07-02 17:59) [30]> [28] VICTOR_ (02.07.12 17:03)
А зачем зарезаешь отрицательные аферкомы? Может же быть и до точки округление.
← →
VICTOR_ (2012-07-02 18:27) [31]Уже не помню - откуда брал идею.
Только что прогнал предложенный тест (-3 до 3 с шагом 0.1) - test passed
Отрицательные аферкомы - честно говоря не задумывался. Такая задача не стояла. Но что-то в этом есть.
← →
Palladin © (2012-07-03 01:14) [32]
> DevilDevil © (29.06.12 10:43)
> 13 лет занимаюсь программированием на Delphiи только сегодня
> я познал вещь, которую раньше даже не мог предположить
Добро пожаловать во взрослый мир. Им правят другие люди.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.059 c