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

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

Мат, округлние [D4]


Страницы:   1 2 3

pasha_golub ©   (2004-10-28 14:59:00) 

Люди, добрые подскажите параметр для FPU 8087, которое нужно кинуть в Set8087CW для того, чтобы округление было не банковским, а математическим. Спасибо.


Verg   (2004-10-28 17:52:00) [41]

Может такая подойдет:

function RoundUp(X: Extended): Extended;
begin
 Result := Trunc(X) + Trunc (Frac(X) * 2);
end;


pasha_golub   (2004-10-28 16:50:00) [42]

Спасибо, ребят.


GuAV   (2004-10-28 16:20:00) [43]

Точнее ещё сложнее :( для положительных округление вверх, а перед округлением отнять .5 для отрицательных добавить .5 и вниз.

Хотя не уверен что есть мат. округление для отр чисел.


GuAV   (2004-10-28 16:09:00) [44]

GuAV ©   (28.10.04 16:06) [7]
То есть наоборот, вниз и добавить .5 и в коде Jeer ©  ничего плохого...


GuAV   (2004-10-28 16:06:00) [45]

Да, выставить округление вверх, а перед округлением отнять .5

Только рекомендую не кодом Jeer ©, а через SetRoundMode, чтоб лишние биты не менять.


Jeer   (2004-10-28 15:28:00) [46]

function RoundUp(Value: Extended): Int64;
const
 RoundUpCW = $1B32;
var
 OldCW: Word;
begin
 OldCW := Default8087CW;
 try
   Set8087CW(RoundUpCW);
   result := Round(Value);
 finally
   Set8087CW(OldCW);
 end;
end;

end;


pasha_golub   (2004-10-28 15:22:00) [47]

Лана, а как же его тогда реализовать? Блин.


pasha_golub   (2004-10-28 15:17:00) [48]

Вот те раз... Вот те два... Спасибо.


pasha_golub   (2004-10-28 15:14:00) [49]

Есть, есть... Блин, мать его за ногу.


GuAV   (2004-10-28 15:14:00) [50]

15                     8    7                    0
+-----------------------++-----------------------+
¦  ¦  ¦  ¦  ¦     ¦     ¦¦  ¦  ¦  ¦  ¦  ¦  ¦  ¦  ¦
¦  ¦  ¦  ¦IC¦ RC  ¦ PC  ¦¦IE¦  ¦PM¦UM¦OM¦ZM¦DM¦IM¦\x11-- Control word
¦  ¦  ¦  ¦  ¦     ¦     ¦¦  ¦  ¦  ¦  ¦  ¦  ¦  ¦  ¦
+-----------------------++-----------------------+

IC--Infinity Control
 0 = Projective (default on 8087 and 80287)
 1 = Affine
 On 80387 and 80486, affine closure (distinguishing between positive
 and negative infinity) is used regardless of setting.

RC--Rounding Control
 00 = Round to nearest or even (default)
 01 = Round down toward -infinity
 10 = Round up toward +infinity
 11 = Chop by truncating toward 0

PC--Precision control
 00 = 24-bit mantissa (single precision)
 10 = 53-bit mantissa (double precision)
 11 = 64-bit mantissa (extended precision)

IE - Interrupt Enable Mask
 Only on 8087; undefined on 80287, 80387, and 80486.

Exception Masks
 PM = 1 to mask precision
 UM = 1 to mask underflow
 OM = 1 to mask overflow
 ZM = 1 to mask zero divide
 DM = 1 to mask denormalized operand
 IM = 1 to mask invalid operation


GuAV   (2004-10-28 15:07:00) [51]

pasha_golub ©   (28.10.04 14:59)

SetRoundMode

rmNearest Rounds to the closest value.
rmDown Rounds toward negative infinity.
rmUp Rounds toward positive infinity.
rmTruncate Truncates the value, rounding positive numbers down and negative numbers up.

AFAIK, это всё что есть - математического нет.


Страницы:   1 2 3

Наверх

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