Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фокусы Delphi, Простая функция Round фокуснечает. 
:(
    Опции темы
Alex
Дата 12.3.2005, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Poseidon, я насколько понимаю, ты меня обвиняешь в том, что я тебе отвечаю не полностью на твой вопрос. Прошу заметить, что я не участвую в обсуждении этой проблемы. Я только дал ссылку на статью, о которой упомянул один из участников. Как говорится, не знаю досконально вопроса и не лезу.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Alex
Дата 12.3.2005, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Полазил я тут по сети и нашел ответ на вопрос.
Цитата
После  Set8087CW(Default8087CW or $0800) Round(2.5) возвращает 3, а Round(3.5) - 4. А после Set8087CW(Default8087CW and $F7FF)  Round(2.5) возвращает 2, а Round(3.5) - 4(т.н. "банковское округление"). По умолчанию этот флаг сброшен, т.е. работает "банковское округление".(Проверял на D3 и W98)
Когда я впервые с этим столкнулся, то подумал, что это "происки империалистов":o). Но с удивлением обнаружил в "Правилах округления": "Если отбрасываемая цифра 5, а за ней нет значащих цифр, то округление производится на ближайшее четное число"(© М.Я. Выгодский, "Справочник по элементарной математике", М., 1966)



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Петрович
Дата 12.3.2005, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата(Poseidon @ 12.3.2005, 21:17)
Даже в справке Delphi написано
Цитата
Round returns an Int64 value that is the value of X rounded to the nearest whole number

На сколько я понял, перевод этого звучит так: "Round возвращает значение Int64, каторое является значением Х, округленным к самому близкому целому числу. Коментарии я думаю излишни.

А следующее предложение в хелпе переводить не пробовал? Тогда помогу я smile
Цитата
If X is exactly halfway between two whole numbers, the result is always the even number.

Если X точно посередине между двумя числами, результат будет ЧЕТНЫМ числом.


Цитата(Poseidon @ 12.3.2005, 21:17)
Как видно Round не справляется.

Читайте внимательнее хелп!

Цитата(Poseidon @ 12.3.2005, 21:17)
PS. Хотелось бы все таки узнать, есть ли та функция, что округлит 3,5 к 4 ("по известным правилам").

Если имеются ввиду школьные правила, то читай внимательнее мой пост выше


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Alex
Дата 12.3.2005, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Poseidon, если ты задаешь вопрос, и тебе отвечают, то будь любезен проверять то, что тебе предлагают, а не орать на весь форум, что тебя обидели и все такие нехорошие.

Держи свой код smile
Код

var
  str: string;
  x,y: real;
begin
  x:= 0.5;
  y:= 1.5;
  str:= FloatToStr(SimpleRoundTo(x, 0) + SimpleRoundTo(y, 0));
  ShowMessage(str);
end;



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Poseidon
Дата 13.3.2005, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Alex
Цитата
насколько понимаю, ты меня обвиняешь в том, что я тебе отвечаю не полностью на твой вопрос.
Цитата
если ты задаешь вопрос, и тебе отвечают, то будь любезен проверять то, что тебе предлагают, а не орать на весь форум, что тебя обидели и все такие нехорошие.
Принашу свои извенения, если кого-то ненароком зацепил словом или обидел. Я этого не хотел.
Цитата
а не орать на весь форум, что тебя обидели и все такие нехорошие
Вообще-то такого не было! Но я еще раз извеняюсь, если что-то написал не так.

Петрович
Цитата
Читайте внимательнее хелп!
Вот уж точно: "поспешишь - людей насмешишь". Да, во внимательность сила!

Огромное спасибо всем кто принял участие в обсуждении этой темы!!! Отдельное спасибо Петрович и Alex. В следующий раз буду по внимательнее.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
amsoft
Дата 10.12.2009, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



Возвращаясь к старой теме:

Недавно тоже столкнулся с такой некорректной работой функции Round.
При округлении числа, дробная часть которого = 0.5 всегда возвращает четное число, это баг с точки зрения математики (тем более каждое неправильное округление в моем случае может обойтись в реальную "копеечку"). Но разработчикам дельфей видать не знакомы правила математики  smile 
Я победил это так:

Код

function MyRound(X: Real): Integer;
begin
Result := Trunc(X);
if (X - Result) >= 0.5 then Result := Result + 1;
end;


ЗЫ У меня D5, может в более поздних версиях нет такого бага
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Демо
Дата 10.12.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



amsoft

Код

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”.


Код

Round half to even

A tie-breaking rule that is even less biased is round half to even, namely
If the fraction of y is 0.5, then q is the even integer nearest to y.

Thus, for example, +23.5 becomes +24, +22.5 becomes +22, -22.5 becomes -22, and -23.5 becomes -24. This variant of the round-to-nearest method is also called unbiased rounding, convergent rounding, statistician's rounding, Dutch rounding, Gaussian rounding, or bankers' rounding. For most reasonable distributions of y values, the expected (average) value of the rounded numbers is essentially the same as that of the original numbers, even if the latter are all positive (or all negative). This is widely used in bookkeeping.


Так что никакого глюка. В Help именно так и описано поведение Round.

Это сообщение отредактировал(а) Демо - 10.12.2009, 11:44


--------------------
    
PM MAIL ICQ Skype   Вверх
amsoft
Дата 10.12.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



Демо
я знаю - читал уже, но меня не устраивает такой метод округления.
Кстати, раз уж его называют "Banker’s Rounding", то могли бы его засунуть в функцию типа BankerRound, а Round сделали бы нормальным.

Чуть модернизировал, теперь работает с отрицательными числами тоже  smile 

Код

function SmartRound(X: Extended): Int64;
begin
Result := Trunc(X);
if Abs(X - Result) >= 0.5
then if X < 0
     then Dec(Result)
     else Inc(Result);
end;


ЗЫ Не побоюсь этого слова Smart  smile 
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
amsoft
Дата 10.12.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



кстати, есть ли в делфях уже готовая подобная функция, чтобы велосипедостроительством не заниматься?
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
profesiachuvak
Дата 10.12.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: нет
Всего: 4



Цитата(amsoft @ 10.12.2009,  12:53)
кстати, есть ли в делфях уже готовая подобная функция, чтобы велосипедостроительством не заниматься?

Да какой тут велосипед, ранее предлогалось сделать так
Код

var 
i,s:real;
begin
i:=2.5; /к примеру возьмём это число
s:=trunc(i+0.5);
end;


Вот и весь велосипед. Округляй с помощью trunc() и получишь нормальное математическое округление по школьным правилам.


--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
amsoft
Дата 10.12.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



profesiachuvak

где-то в этой теме промелькала такая мысль, почему-то не обратил на нее внимание сразу

Thx
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Alexeis
Дата 10.12.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



profesiachuvak, а если число отрицательное? 



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Демо
Дата 10.12.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(profesiachuvak @  10.12.2009,  13:43 Найти цитируемый пост)
Вот и весь велосипед. Округляй с помощью trunc() и получишь нормальное математическое округление по школьным правилам.


Этот велосипед для простейших случаев.


Цитата(profesiachuvak @  10.12.2009,  13:43 Найти цитируемый пост)
var i,s:real;begini:=2.5; /к примеру возьмём это числоs:=trunc(i+0.5);end;


Простой пример - 2.4(9), получающееся в процессе вычислений.


--------------------
    
PM MAIL ICQ Skype   Вверх
Beltar
Дата 10.12.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Цитата

Округляй с помощью trunc() и получишь нормальное математическое округление по школьным правилам.


trunc(3.9)=3, а не 4.

Лучше уж frac(x)>0.5 проверять.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
amsoft
Дата 10.12.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



Alexeis
немного подшаманить можно:

Код

if i < 0 
then Result := Trunc(i-0.5) 
else Result := Trunc(i+0.5)


Добавлено через 1 минуту и 2 секунды
Beltar
а прибавлять 0.5 кто будет?
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0955 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.