|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
Цитата:
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось 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; |