Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Я В ШОКЕ. Стандарт округления в 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.05 c
2-1337283963
TStas
2012-05-17 23:46
2013.03.22
Правая клавиша в ричЭдит


2-1342612696
Светлана
2012-07-18 15:58
2013.03.22
Контекстное и главное меню


6-1261335712
Vladimir
2009-12-20 22:01
2013.03.22
Передача записи по сети через сокеты


2-1337169674
Дмитрий Белькевич
2012-05-16 16:01
2013.03.22
автоинкрементное поле в TClientDataSet


3-1284757383
Vladimir3466
2010-09-18 01:03
2013.03.22
delphi 10 + ADOQuery.Parameters = параметр не найден