Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 04.06.2016, 06:53
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

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  
Старый 04.06.2016, 15:26
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
не одного байта, а всех по-отдельности.
И зачем переводить байты по отдельности? Раз знаешь, как содержатся вещественные числа, то нужно понимать, что перевод байтов по отдельности не даст ничего.
Цитата:
35 C2 68 21 A2 DA 0F C9 (Extended) -> ? -> 3,1415... (десятичное).
Extended в Delphi - расширенный тип, и его размер 10 байт, а не 8. Так что последние 2 из вывода '35 C2 68 21 A2 DA 0F C9 00 40' отброшены зря. Очевидно, после их отбрасывания перевести число в обычный вид не получится никак.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 04.06.2016 в 15:52.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
SpectraL (05.06.2016)
  #18  
Старый 04.06.2016, 23:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от SpectraL
lmikle, твой код не работает. Что это такое: I := ^Byte(E)?

Да, попутал немного, не проверил, когда писал.
Можно вот так:
Код:
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  
Старый 05.06.2016, 08:51
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Можно вот так
При E = Pi, возвращает неправильное значение '35 68 A2 0F 00 00 20 3B D0 18' (должно быть 35 C2 68 21 A2 DA 0F C9 00 40).

Последний раз редактировалось SpectraL, 05.06.2016 в 08:58.
Ответить с цитированием
  #20  
Старый 05.06.2016, 09:59
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Вот заглядываю в эту тему с самого её появления и не пойму, что конкретно хочет ТС и зачем. Ну да ладно.
Вот так получается результат требуемый ТС.
Код:
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  
Старый 06.06.2016, 12:38
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
Лампочка

Преобразование найдено: 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  
Старый 08.06.2016, 04:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от SpectraL
Как можно (помимо 'StrToFloat(FloatToStrF())') округлить вещественное число до определённой точности?

RoundTo.
Вот только зачем? Считай с макс точностью и делай вывод с форматированием. Ошибка меньше будет.

А вообще, непонятны причины этих "танцев".
Нафига все это.
Мне кажется, что ТС сам не понимает, что ему надо, соответсвенно, задает неправильные вопросы.

ЗЫ. Сравнивать 2 вещественных числа через '=' все равно не получится.
Ответить с цитированием
  #23  
Старый 08.06.2016, 10:00
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

lmikle, "до определённой точности" подразумевается до определённого количества значащих цифр (как у параметра Precision функции FloatToStrF), а не до цифры от разделителя (как у RoundTo).
Меня не интересует "сравнивание" я просто разбираюсь с вещественными числами.
Ответить с цитированием
  #24  
Старый 13.06.2016, 12:15
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Вещественные типы и их экземпляры могут использовать элементы записи-помощника (например, 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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter