![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
||||
|
||||
|
Bargest,
1. чтобы преобразовать в десятичный. 2. с тех самых когда не занимались флудом. 3. не одного байта, а всех по-отдельности. 4. я знаю как содержится вещественное число в компьютере (в трёх разделах и формулах), остальное объясните вы. 2C 01 (Word) -> 01 2C (читаем справа налево) -> 300 (десятичное). 35 C2 68 21 A2 DA 0F C9 (Extended) -> ? -> 3,1415... (десятичное). Последний раз редактировалось M.A.D.M.A.N., 04.06.2016 в 10:06. Причина: merge |
|
#17
|
||||
|
||||
|
Цитата:
Цитата:
Последний раз редактировалось Bargest, 04.06.2016 в 15:52. |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
SpectraL (05.06.2016)
| ||
|
#18
|
|||
|
|||
|
Цитата:
Да, попутал немного, не проверил, когда писал. Можно вот так: Код:
procedure TForm1.Button1Click(Sender: TObject);
var
E : Extended;
I : PChar;
J : Integer;
S : String;
begin
S := '';
E := 123.456789;
I := @E;
For J := 0 To SizeOf(Extended)-1 Do
Begin
S := S + IntToHex(Byte(I^),2) + ' ';
I := I + 1;
End;
Edit1.Text := S;
end;Кстати, более правильная версия, т.к. на 64 бита длинна Extended почему-то 8 байт. |
|
#19
|
||||
|
||||
|
Цитата:
Последний раз редактировалось SpectraL, 05.06.2016 в 08:58. |
|
#20
|
||||
|
||||
|
Вот заглядываю в эту тему с самого её появления и не пойму, что конкретно хочет ТС и зачем. Ну да ладно.
Вот так получается результат требуемый ТС. Код:
type
TExtendedAsByteArray = array[0..SizeOf(Extended) - 1] of Byte;
var
EaBA: TExtendedAsByteArray;
ext: Extended;
i: Byte;
s: string;
begin
ext := pi;
System.Move(ext, EaBA[0], SizeOf(Extended));
s := '';
for i := 0 to SizeOf(Extended) - 1 do
s := s + IntToHex(EaBa[i], 2) + #32;
ShowMessage(s);
end;Последний раз редактировалось dr. F.I.N., 05.06.2016 в 10:05. |
| Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
SpectraL (05.06.2016)
| ||
|
#21
|
||||
|
||||
|
Преобразование найдено: 35 C2 68 21 A2 DA 0F C9 00 40 (двоичное) -> 40 00 C9 0F DA A2 21 68 C2 35 (читаем справа налево) -> 0100 0000 0000 0000 1100 1001... -> 0 | 100 0000 0000 0000 | 1100 1001... (Extended, в отличии от других типов, содержит первую цифру мантиссы) -> 11.001001... -> 3.1415... (десятичное).
Как можно (помимо 'StrToFloat(FloatToStrF())') округлить вещественное число до определённой точности? Последний раз редактировалось SpectraL, 06.06.2016 в 12:52. |
|
#22
|
|||
|
|||
|
Цитата:
RoundTo. Вот только зачем? Считай с макс точностью и делай вывод с форматированием. Ошибка меньше будет. А вообще, непонятны причины этих "танцев". Нафига все это. Мне кажется, что ТС сам не понимает, что ему надо, соответсвенно, задает неправильные вопросы. ЗЫ. Сравнивать 2 вещественных числа через '=' все равно не получится. |
|
#23
|
||||
|
||||
|
lmikle, "до определённой точности" подразумевается до определённого количества значащих цифр (как у параметра Precision функции FloatToStrF), а не до цифры от разделителя (как у RoundTo).
Меня не интересует "сравнивание" я просто разбираюсь с вещественными числами. |
|
#24
|
||||
|
||||
|
Вещественные типы и их экземпляры могут использовать элементы записи-помощника (например, TSingleHelper), который в частности содержит свойство Bytes, позволяющее побайтно рассмотреть двоичный код экземпляра, вызвавшего 'Bytes'. Например:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
i: Single;
begin
i := 12.34;
ShowMessage(IntToHex(i.Bytes[0], 2) + ' ' + IntToHex(i.Bytes[1], 2) + ' ' +
IntToHex(i.Bytes[2], 2) + ' ' + IntToHex(i.Bytes[3], 2))
end; |