Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.023 c
7-1081883007
Mozzzila
2004-04-13 23:03
2004.05.23
Слежение за обращением к реестру


14-1083247520
2bad
2004-04-29 18:05
2004.05.23
чё делать?


14-1083157187
Style
2004-04-28 16:59
2004.05.23
Windows и Память


1-1083759816
Ann_k
2004-05-05 16:23
2004.05.23
Delphi &amp; Excel


1-1083947375
Крутыш
2004-05-07 20:29
2004.05.23
Как в memo вставить символ перевода строки




   Наверх