Я пытаюсь преобразовать расширенное значение с большим показателем в Delphi 7 на Win 7-64, и я получаю исключение «Неверная операция с плавающей запятой» на то, что, по моему мнению, является допустимым значением , Значение равно 3.6854775808e-4912, которое отладчик сообщает без проблем.Ошибка преобразования строки с расширением расширенной строки Delphi
Следующие процедуры были опробованы и все они генерируют это исключение:
FloatToStr. Формат. ФорматFloat. FloatToText.
Кто-нибудь знает, что происходит?
EDIT:
я, вероятно, следовало бы отметить, что я ищу буфер для конкретного расширенного значения и местоположения могут быть любого смещения в буфере. Метод копирует 10 байтов в запись варианта и извлекает увеличенное значение из записи. Затем делается попытка преобразовать расширенное значение в строку, используя одну из описанных выше подпрограмм, которая генерирует ошибку. Я также обнаружил, что попытка умножить значение на 1.0 также порождает ошибку.
TDecoderRec = record
case integer of
0 : (Binary: TBinaryArray);
1 : (Character : TCharArray);
2 : (ShortIntVal: ShortInt);
3 : (ByteVal: Byte);
4 : (SmallIntVal: SmallInt);
5 : (WordVal: Word);
6 : (IntegerVal: Integer);
7 : (LongWordVal: LongWord);
8 : (Int64Val: Int64);
9 : (SingleVal: Single);
10 : (Real48Val: Real48);
11 : (RealVal: Real);
12 : (DoubleVal: Double);
13 : (CompVal: Comp);
14 : (CurrencyVal: Currency);
15 : (ExtendedVal: Extended);
end; { TDecoderRec }
fldExtended.AsExtended:= DecoderRec.ExtendedVal;
procedure TCustomNumericEdit.SetAsExtended(Value: Extended);
begin
AssignText(FloatToStr(Value)); { <<---- FloatToStr causes the error }
end; { TCustomNumericEdit.SetAsExtended }
Эти шестигранный байт, содержащие ExtendedVal:
74 02 08 03 54 6F 70 03 A4 00
Это значение, что отчеты отладчика:
3.6854775808e-4882
program ProjectFloatError;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
var
Value : Extended;
s : String;
begin
try
Value.Bytes[0] := $74;
Value.Bytes[1] := $02;
Value.Bytes[2] := $08;
Value.Bytes[3] := $03;
Value.Bytes[4] := $54;
Value.Bytes[5] := $6F;
Value.Bytes[6] := $70;
Value.Bytes[7] := $03;
Value.Bytes[8] := $A4;
Value.Bytes[9] := $00;
s := FloatToStr(Value); // <-- Invalid floating point operation
WriteLn(s);
ReadLn;
except
on E: Exception do
begin
Writeln(E.ClassName, ': ', E.Message);
ReadLn;
end;
end;
end.
Все должно работать. Мы не видим ваш код. –
@DelphiFan: Происходит ли ошибка при преобразовании из 'Extended' в' String' или от 'String' до' Extended'? Если вы начинаете с 'Extended', для любой из этих функций не имеет смысла сбой при создании' String', так как у вас уже есть 'Extended' в памяти. Но преобразование 'StrToFloat()', конечно, может завершиться ошибкой, если представленное значение слишком велико, чтобы вписаться в 'Extended'. Как сказал Дэвид, пожалуйста, покажите фактический код, который терпит неудачу. –
@ Дэвид и Реми: Я должен был быть более ясным, сожалею об этом. Похоже, что поле ExtendedVal записи действительно возвращает недопустимую комбинацию байтов. Странно то, что отладчик не имеет проблем с ним и отображает значение, которое находится в допустимом диапазоне. – DelphiFan