Главная страница
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.022 c
1-1083916381
Saturn
2004-05-07 11:53
2004.05.23
Поиск Файла


4-1080997615
Swimmer
2004-04-03 17:06
2004.05.23
Загрузка bmp-ресурса в массив


3-1083320576
Однако
2004-04-30 14:22
2004.05.23
про RzDBLookupComboBox, модальное окно и кнопку Cansel


3-1083152021
КоммофОнСамый
2004-04-28 15:33
2004.05.23
помогите Найти пример к Employee.gdb


11-1071838359
SAGE
2003-12-19 15:52
2004.05.23
Ошибка: already in skipping mode.