Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.51 MB
Время: 0.067 c
2-1331979813
>|<
2012-03-17 14:23
2013.03.22
DrawFocusRect


15-1351936374
xayam
2012-11-03 13:52
2013.03.22
Google App Engine (GAE)


2-1332316064
Ega23
2012-03-21 11:47
2013.03.22
Знатокам TVirtualStringTree


2-1342770409
Andvitar
2012-07-20 11:46
2013.03.22
Програмное нажатие на Button 1 при изменении буфера обмена


6-1266224883
keymaster
2010-02-15 12:08
2013.03.22
Трабл с IDHTTP





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