Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Round на разных компах возвращает разные значения   Найти похожие ветки 

 
MakNik ©   (2004-04-30 12:36) [0]

Ф-ция Round(X*100)*0.01 на разных компах возвращает разные значения. При Х=25.185 на одной возвращает 25.19, на другой возвращает 25.18.
Подскажите, плз., как с этим бороться!?


 
Романов Р.В. ©   (2004-04-30 12:43) [1]

не помню есть ли в D5 функция SetRoundMode


 
MakNik ©   (2004-04-30 12:48) [2]


> Романов Р.В. ©   (30.04.04 12:43) [1]
> не помню есть ли в D5 функция SetRoundMode

... похоже что нет


 
Григорьев Антон   (2004-04-30 12:49) [3]

В D5 точно нет.


 
Романов Р.В. ©   (2004-04-30 12:50) [4]

SetRoundMode function

Sets the FPU rounding mode.

Unit

Math

Category

FPU control

type TFPURoundingMode = (rmNearest, rmDown, rmUp, rmTruncate);
function SetRoundMode(const RoundMode: TFPURoundingMode): TFPURoundingMode;

Description

Call SetRoundingMode to specify how the FPU handles rounding issues. The rounding mode can be any of the following values:

Value Meaning

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.

type
 TFPURoundingMode = (rmNearest, rmDown, rmUp, rmTruncate);

procedure Set8087CW(NewCW: Word);
begin
 Default8087CW := NewCW;
 asm
       FNCLEX  // don"t raise pending exceptions enabled by the new flags
{$IFDEF PIC}
       MOV     EAX,[EBX].OFFSET Default8087CW
       FLDCW   [EAX]
{$ELSE}
       FLDCW   Default8087CW
{$ENDIF}
 end;
end;

function SetRoundMode(const RoundMode: TFPURoundingMode): TFPURoundingMode;
var
 CtlWord: Word;
begin
 CtlWord := Get8087CW;
 Set8087CW((CtlWord and $F3FF) or (Ord(RoundMode) shl 10));
 Result := TFPURoundingMode((CtlWord shr 10) and 3);
end;


 
Романов Р.В. ©   (2004-04-30 12:55) [5]

function Get8087CW: Word;
asm
       PUSH    0
       FNSTCW  [ESP].Word
       POP     EAX
end;


 
MakNik ©   (2004-05-05 10:53) [6]


> Романов Р.В. ©   (30.04.04 12:55) [5]

Для значений rmDown, rmUp, rmTruncate - все работает, а вот для rmNearest - прежняя проблема (а нужно как раз rmNearest). Подскажите, плз., в чем проблема?


 
Романов Р.В. ©   (2004-05-05 12:44) [7]

Прям и не знаю. Числа точно одинаковые? Сделай тестовую программу, которая будет считывать число в двоичном виде из файла и выводить на экран.


 
MakNik ©   (2004-05-05 13:35) [8]

Числа одинаковые. Может дело в железе? Что делать?


 
Романов Р.В. ©   (2004-05-05 13:45) [9]

Напиши свою процедуру.

if Frac(Value) < 0.5 then
 Result := Trunc(Value)
else
 if Frac(Value) > 0.5 then
   Result := Trunc(Result + 1)
 else
   If Frac(Value) mod 2 = 1 then
     Result := Trunc(Result + 1)
   else
     Result := Trunc(Value);



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
14-1083663635
Piter
2004-05-04 13:40
2004.05.23
Эстонская водка


14-1083328106
uny
2004-04-30 16:28
2004.05.23
тема такая странная


7-1081868205
Paladin
2004-04-13 18:56
2004.05.23
Выключение компа


14-1083249941
Piter
2004-04-29 18:45
2004.05.23
Как правильно читается слово "Inherited" ?


14-1083217017
Думкин
2004-04-29 09:36
2004.05.23
С днем рождения! 29 апреля.