Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Математическое округление чисел и другое


Влад ©   (2007-02-14 16:09:00) 

Необходим аналог функции RoundTo (округление в любом порядке), но правильно работающая. Стандартная функция округляет к четным числам.

Была написана следующая функция:

function MyRoundTo(D: Extended; Prec: Integer): Extended;
var
 V, K: Extended;
begin
 K := IntPower(10, Prec);
 V := Trunc(  Abs(D) * K + 0.5 );
 Result := V / K * Sign(D);
end;

эта функция в основном свою задачу решает, но в редких случаях даёт неверный результат, например:
X= 0,9954
MyRoundTo(X, 2) = 0,99
а ожидалась 1.

В таком виде функция работает правильно:

function MyRoundTo(D: Extended; Prec: Integer): Extended;
var
 V, K: Extended;
begin
 K := IntPower(10, Prec);
 V := Trunc( StrToFloat( FloatToStr( Abs(D) * K + 0.5)) );
 Result := V / K * Sign(D);
end;

как получить тот-же эффект, но без "StrToFloat( FloatToStr(" ?


Влад   (2007-02-15 22:48:00) [1]

Спасибо, интересовала именно эта информация.


AndreyV   (2007-02-15 01:09:00) [2]

Почитай здесь
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1217


Влад   (2007-02-14 17:07:00) [3]


> ну конечно) FLDCW придумана Intel'ом просто так, для забавы


повторите для схватывающих на лету....
как будет выглядеть округление по правилам матиматики?


Сергей М.   (2007-02-14 16:47:00) [4]


> другие режимы кроме rmNearest в функции SetRoundMode вообще
> не приводят к округлению


ну конечно)

FLDCW придумана Intel'ом просто так, для забавы


Влад   (2007-02-14 16:40:00) [5]

Как я уже и писал ф-я Round и RoundTo округляют к чётным числам, т.е.
Round(0.5)=0
Round(1.5)=2
Round(2.5)=2
Round(3.5)=4
и т.д.

В F1 этот метод обозвали "банкирским", но это не то чему нас учили на уроках математики ;)

А другие режимы кроме rmNearest в функции SetRoundMode вообще не приводят к округлению.


Johnmen   (2007-02-14 16:19:00) [6]

RoundTo работает абсолютно правильно, правила описаны в F1


Сергей М.   (2007-02-14 16:19:00) [7]

SetRoundMode() yf nj ceotcndetn


Наверх

Титульная страница Поиск, карта сайта Написать письмо