![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мат, округлние [D4]
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, это всё что есть - математического нет.