Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c