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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.01.2014, 18:42
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию TBcd

Всего один вопрос. W T F?!

Цитата с хелпа:
Цитата:
Precision: The number of digits in the decimal version of the value.
SignSpecialPlaces: The sign bit (0 is positive, any other value negative)
Fraction: An array of BCD nibbles, 00 to 99 per byte, high nibble first. Only the first Precision nibbles are used.
С какого в цифре 1 у него взялось две цифры?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 23.01.2014 в 18:52.
Ответить с цитированием
  #2  
Старый 24.01.2014, 05:22
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Вероятно, одно знакоместо зарезервировано для знака. По умолчанию ведь с пробелом выводится?
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #3  
Старый 24.01.2014, 09:39
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Формата жопошнее чем BCD не видел в жизни.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #4  
Старый 24.01.2014, 12:58
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Bargest
С какого в цифре 1 у него взялось две цифры?
Число 16 в 16-ричной системе счисленния будет как $10. В Precision записано 2, значит число состоит из двух цифр. В SignSpecialPlaces записано 1, значит одна из этих цифр используется для десятичной дроби. Получается, что число 1 было записано как "1,0". Вроде всё правильно, но действительно немного странно. В Delphi 7 такой странности нет - Precision=1 и SignSpecialPlaces=0, а в Delphi XE2 такая странность действительно наблюдается.

Впрочем модуль FMTBcd.pas известен своими ошибками. Например такое безобидное выражение:
Код:
  ShowMessage( VarFMTBcdCreate(20) / VarFMTBcdCreate(6) );
в Delphi 7 вызывает исключение EBcdOverflowException. Какое же здесь может быть переполнение? А Delphi XE2 уже показывает правильный результат: "3,3333333333"
Ответить с цитированием
  #5  
Старый 24.01.2014, 18:52
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
По умолчанию ведь с пробелом выводится?
Фиг его знает. Не выводил.
Цитата:
Число 16 в 16-ричной системе счисленния будет как $10. В Precision записано 2, значит число состоит из двух цифр. В SignSpecialPlaces записано 1, значит одна из этих цифр используется для десятичной дроби. Получается, что число 1 было записано как "1,0".
Да уж, гениальная запись инта. Особенно напрягает, что в доке-то написано: SignSpecialPlaces: The sign bit (0 is positive, any other value negative). И ни слова про дроби.
Цитата:
Формата жопошнее чем BCD не видел в жизни.
Он удобен в одном применении - вывод. RTC-часики типа DS1307 в нем считают и отдают время. Учитывая, что работа с ними идет с МК, где деления нет и в помине, BCD очень удобно выводить на экран и вообще переводить в строку - не надо делить на 10. Тупо разбил маской на 2 части и прибавил 0x30 (хотя поскольку у меня в девайсе только цифры, даже прибавлять не надо, в моей кодировке всего 11 символов). Ну а у меня запись времени в часики идет с компа.
В итоге забил на этот глюкомодуль и сделал проще:
Код:
function toBCD(val:byte): byte;
begin
  if val > 99 then
     result := 0;
  else
     result := ((val div 10) shl 4) + (val mod 10);
end;
Поскольку мне достаточно кодировать 1 байт.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 24.01.2014 в 18:57.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter