восстановить обратно (до точного совпадения побайтно). Не смогли написать. Сделали хранение байтового представления в виде hex строки. Интересная задачка. Может кто то возьмется? :)
хранить байтовое представление — это единственный способ
это невыполнимо в десятичной системе
вполне выполнимо, Вопрос зачем
Сохранение данных в текстовый файл и восстановление обратно без потери данных.
зачем тут файл? 🤦♂️ плюсовые to_char/from_char по стандарту гарантируют точное восстановление.
да, стормозил, можно
function DoubleToHex(const d:double):string; begin SetLength(result,SizeOf(d)*2); BinToHex(@d,PChar(result),SizeOf(d)); end; function HexToDouble(const str:string):double; begin HexToBin(PChar(str),@result,SizeOf(result)); end;
Это несомненно гораздо быстрее и проще, чем конвертить в текст.
Хранить ввиде TExt80Rec а именно отдельно мантису и экспоненту, потом так-же собрать обратно
function DoubleToHexString(const Value: Double): String; begin Result := '$' + IntToHEx(PInt64(@Value)^, 16); end; function HexStringToDouble(const Value: String): Double; begin PInt64(@Result)^ := StrToInt64(Value); end;
procedure TForm1.FormCreate(Sender: TObject); var i:integer; d:double; c1,c2:cardinal; begin d:=100.2; c1:=TThread.GetTickCount; for i := 0 to 10000000 do HexToDouble(DoubleToHex(d)); c1:=TThread.GetTickCount-c1; c2:=TThread.GetTickCount; for i := 0 to 10000000 do HexStringToDouble(DoubleToHexString(d)); c2:=TThread.GetTickCount-c2; Caption:=IntToStr(c1)+':'+IntToStr(c2); end;
https://docwiki.embarcadero.com/Libraries/Alexandria/en/Data.FmtBcd.TBcd
Обсуждают сегодня