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

Delphi Sources



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

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

Код:
procedure TForm1.FormCreate(Sender: TObject);
  var
    a, b, c: Extended;
begin
  a := 212.53;
  b := 212.49;
  c := a - b;

  if c = 0.04 then
    ShowMessage(FloatToStr(c))
end;
Переменная 'c' не равна 0.04. Как можно увидеть её значение?
Ответить с цитированием
  #2  
Старый 01.06.2016, 09:21
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

9-ую строчку заменить на
Код:
if Abs(c-0.04)<0.00000001 then
почему так надо уже много раз писали.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 01.06.2016, 10:12
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Я имею ввиду как увидеть истинное значение переменной 'с'. Например, в виде 0.039999999999999993895990990009 или двоичного кода.

Последний раз редактировалось SpectraL, 01.06.2016 в 10:44.
Ответить с цитированием
  #4  
Старый 01.06.2016, 10:41
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
ShowMessage(FloatToStrF(c, ffGeneral, 100, 100));
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
SpectraL (01.06.2016)
  #5  
Старый 01.06.2016, 10:55
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Спасибо, это более точное значение, но не истинное.

Последний раз редактировалось SpectraL, 01.06.2016 в 11:02.
Ответить с цитированием
  #6  
Старый 02.06.2016, 07:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, если тебе бинарное, то как-то так:
Код:
var
  E : ^Extended;
  I : ^Byte;
begin
  E^ := 123.4567890;
  I := ^Byte(E);
  For I := 0 To 9 Do
    Begin
      Writeln(IntToStr(I));
      I := I+1;
    End;

Двоичный код уж сам как-нить "выдерешь".
Ответить с цитированием
  #7  
Старый 02.06.2016, 08:43
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

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

Последний раз редактировалось SpectraL, 02.06.2016 в 08:53.
Ответить с цитированием
  #8  
Старый 02.06.2016, 14:39
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
type
  PByteArr = ^TByteArr;
  TByteArr = array [0..9] of Byte;
var
  e: Extended;
  pe: PByteArr;
  i: Integer;
begin
  e:=Pi;
  pe:=@e;
  for i:=0 to 9 do
  begin
    Memo1.Text:=Memo1.Text+IntToHex(pe^[i], 2)+' ';
  end;
end;
Ну вот этот точно работает, но не решит проблемы со сравнением вещественных чисел.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
SpectraL (03.06.2016)
  #9  
Старый 03.06.2016, 11:32
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

1. Можно ли увидеть истинное значение с помощью отладчика (например, при трассировке)?
2. Есть ли подпрограмма округления до определённого количества значащих цифр?

Последний раз редактировалось SpectraL, 03.06.2016 в 12:24.
Ответить с цитированием
  #10  
Старый 03.06.2016, 12:40
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
1. Можно ли увидеть истинное значение с помощью отладчика (например, при трассировке)?

Конечно:
1. Останавливаешь программу по брекпоинту.
2. Смотришь адрес переменной.
3. Смотришь память по этому адресу.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #11  
Старый 03.06.2016, 12:54
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Aristarh Dark, а как посмотреть адрес и память?
Ответить с цитированием
  #12  
Старый 03.06.2016, 14:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

View - Debug Windows - CPU Windows - Entire CPU|Memory
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
SpectraL (03.06.2016)
  #13  
Старый 03.06.2016, 19:32
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
Код:
type
  PByteArr = ^TByteArr;
  TByteArr = array [0..9] of Byte;
var
  e: Extended;
  pe: PByteArr;
  i: Integer;
begin
  e:=Pi;
  pe:=@e;
  for i:=0 to 9 do
  begin
    Memo1.Text:=Memo1.Text+IntToHex(pe^[i], 2)+' ';
  end;
end;
Возвратило '35 C2 68 21 A2 DA 0F C9 00 40'. Преобразование каждого шестнадцатеричного числа в двоичный код не привело к равенству со значением 3.1415. Что нужно сделать?

Последний раз редактировалось SpectraL, 03.06.2016 в 20:19.
Ответить с цитированием
  #14  
Старый 03.06.2016, 22:50
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

При чем тут двоичный код? И с каких пор Pi = 3.1415? В моей вселенной Пи примерно равно
Цитата:
Сообщение от Википедии
3,1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 5923078164 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 5058223172 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 4428810975 6659334461 2847564823 3786783165 2712019091 4564856692 3460348610 4543266482 1339360726 0249141273 7245870066 0631558817 4881520920 9628292540 9171536436 7892590360 0113305305 4882046652 1384146951 9415116094 3305727036 5759591953 0921861173 8193261179 3105118548 0744623799 6274956735 1885752724 8912279381 8301194912 9833673362 4406566430 8602139494 6395224737 1907021798 6094370277 0539217176 2931767523 8467481846 7669405132 0005681271 4526356082 7785771342 7577896091 7363717872 1468440901 2249534301 4654958537 1050792279 6892589235 4201995611 2129021960 8640344181 5981362977 4771309960 5187072113 4999999837 2978049951 0597317328 1609631859 5024459455 3469083026 4252230825 3344685035 2619311881 7101000313 7838752886 5875332083 8142061717 7669147303 5982534904 2875546873 1159562863 8823537875 9375195778 1857780532 1712268066 1300192787 6611195909 2164201989
И вообще, как перевод одного байта из шестнадцатеричного вида в двоичный мог дать дробное число? Прежде, чем заниматься такими странными действиями, стоит прочитать про кодирование чисел с плавающей точкой.
Как сравнивать дробные числа было сказано ранее. В первом ответе в этой теме.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 03.06.2016 в 22:58.
Ответить с цитированием
  #15  
Старый 04.06.2016, 00:37
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
Смех

Offtop
Цитата:
Сообщение от Bargest
В моей вселенной Пи примерно равно
Вот ведь сноб
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Bargest (04.06.2016)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter