Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2013, 11:18   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию Приведение типов. Время.

Доброго времени суток!

Учу чужой компилятор конверсии, и приведению типов, времени, нативными функциями.

Есть некий DateTime - который, согласно док-ии, является вещественным Double, и размером 8 байт.
Есть ещё вещественный Extended в 10 байт.

В Delphi по аналогии TDateTime так же равен 8 байт.

В компиляторе привожу к Double так:
Код:
function TimeToDouble(aTime:DateTime):Double;
begin
  Move(aTime,Result,8);
end;  

function DoubleToTime(aDouble:Double):DateTime;
begin
  Move(aDouble,Result,8);
end;
Тестирую, правильноли работает, относительно Delphi:
В скрипт. движке:
Код:
var
  d1,d2:DateTime;
  e1,e2:Double;
begin
  d1:=EncodeDateTime(2012,1,1,0,0,0,0);
  d2:=Now;
  e1:=TimeToDouble(d1);
  e2:=TimeToDouble(d2);
  Log('DOTestDaysBetween','d1 = '+DateToStr(d1),'');
  Log('DOTestDaysBetween','d2 = '+DateToStr(d2),'');
  Log('DOTestDaysBetween','e1 = '+FloatToStr(e1),'');
  Log('DOTestDaysBetween','e2 = '+FloatToStr(e2),'');
в Delphi:
Код:
var
  d1,d2:TDateTime;
  e1,e2:Double;
begin
  d1:=StrToDateTime('01.01.2012');
  d2:=Now;
  e1:=d1;
  e2:=d2;
  Memo1.Lines.Add('d1 = '+DateToStr(d1));
  Memo1.Lines.Add('d2 = '+DateToStr(d2));
  Memo1.Lines.Add('e1 = '+FloattoStr(e1));
  Memo1.Lines.Add('e2 = '+FloattoStr(e2));
Итоги:

В скрипт. движке:
Код:
d1 = 01.01.2012 
d2 = 29.10.2013 
e1 =  4.09090000000000E+0004 
e2 =  4.15764242106018E+0004
в Delphi:
Код:
Memo1
d1 = 01.01.2012
d2 = 29.10.2013
e1 = 40909
e2 = 41576,4240919676
Собственно, что я не так сделал? Почему в скрипт. движке целых всего 4, а в delphi их аж 41576. Чем лечить?
Операции сдвига(shl,shr) не поддерживаются скрипт. движком.

Последний раз редактировалось Человек_Борща; 29.10.2013 в 11:22.
Человек_Борща вне форума Ответить с цитированием
Старый 29.10.2013, 11:25   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,323
По умолчанию

4.15764242106018E+0004 = 4.15764242106018 * 10^4 = 41576.4242106018
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.10.2013, 11:36   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Целую часть скрипт движок может выделять, что-то в духе Trunc? Если может, то все решение

ADD Это все к тому вопросу по SQL? Чем не устраивает решение в запросе? Проще и работает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 29.10.2013 в 11:40.
Аватар вне форума Ответить с цитированием
Старый 29.10.2013, 11:44   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

BDA, если я вас правильно понял, то:
Код:
function TimeToDouble(aTime:DateTime):Double;
begin
  Move(aTime,Result,8);
  Result := Result * Power(10,4);
end;
теперь выдает немного не то...
Код:
d1 = 01.01.2012 
d2 = 29.10.2013 
e1 =  4.09090000000000E+0008 
e2 =  4.15764459631713E+0008
Цитата:
Целую часть скрипт движок может выделять, что-то в духе Trunc?
Trunc,Frac -нету. Есть Round.
Человек_Борща вне форума Ответить с цитированием
Старый 29.10.2013, 11:49   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
теперь выдает немного не то
А что не то? Умножили на 10^4 и получили то, что хотели - 415764459.631713. Почитайте об внутреннем представлении вещественных чисел в памяти. Порядок, мантиса.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.10.2013, 11:58   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,323
По умолчанию

Я имел ввиду, что эти записи эквивалентны.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.10.2013, 12:08   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,596
По умолчанию

4.09090000000000E+0004 означает умножить на 10^4 - экспоненциальная форма записи вещественного числа.
А что за скриптовой движок, идентичный Делфи? В Делфи приведение типа проще сделать так: Result := Double(aTime);
Arigato вне форума Ответить с цитированием
Старый 29.10.2013, 12:12   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Провел такой эксперимент:
Код:
function TimeToDouble(aTime:DateTime):Double;
var 
  s:string;
  d:Double;
begin
  Move(aTime,Result,8);
  Result := Result * Power(10,4);
end;  

function DoubleToTime(aDouble:Double):DateTime;
var 
 d:Double;
begin
  d:=aDouble div Power(10,4);
  Move(d,Result,8);
end;

.....

var
  d1,d2:DateTime;
  e1,e2:Double;
begin
  d1:=EncodeDateTime(2012,1,1,0,0,0,0);
  d2:=Now;
  e1:=TimeToDouble(d1);
  e2:=TimeToDouble(d2);
  Log('DOTestDaysBetween','d1 = '+DateToStr(d1),'');
  Log('DOTestDaysBetween','d2 = '+DateToStr(d2),'');
  Log('DOTestDaysBetween','e1 = '+FloatToStr(e1),'');
  Log('DOTestDaysBetween','e2 = '+FloatToStr(e2),'');
  d1:=DoubleToTime(e1);
  d2:=DoubleToTime(e2);
  Log('DOTestDaysBetween','e1-d1 = '+DateToStr(d1),'');
  Log('DOTestDaysBetween','e2-d2 = '+DateToStr(d2),'');
  e1:=TimeToDouble(d1);
  e2:=TimeToDouble(d2);
  Log('DOTestDaysBetween','d1-e1 = '+FloatToStr(e1),'');
  Log('DOTestDaysBetween','d2-e2 = '+FloatToStr(e2),'');
Итого:
Цитата:
d1 = 01.01.2012
d2 = 29.10.2013
e1 = 4.09090000000000E+0008
e2 = 4.15764638682639E+0008
e1-d1 = 01.01.2012
e2-d2 = 29.10.2013
d1-e1 = 4.09090000000000E+0008
d2-e2 = 4.15760000000000E+0008
В чем тут магия?
Почему точка стоит после 4, а в delphi точка стоит после 41576?

Цитата:
А что за скриптовой движок, идентичный Делфи?
Коммерческий.
Не идентичный, но мощьный. Очень урезан много в чем, нет приведения типов(вообще нет), нет shr, shl нет кучи других банальных плюшек. Потому простые вещи приходится писать самому. Вообще нет библиотеки работы с датами, пишу её сам.
В Delphi DaysSpan релизован как DateA - DateB, здесь так нельзя. Сижу, разбираюсь как это происходит на уровне коомпилятора.

Последний раз редактировалось Человек_Борща; 29.10.2013 в 12:16.
Человек_Борща вне форума Ответить с цитированием
Старый 29.10.2013, 12:22   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Значит FloatToStr реализована по разному, возможно отличается и внутреннее представление. Тут наврал. Хранение в нормализованном виде должно быть. 10.5 можно отображать и в виде 10.5E+0000 и 1.05E+0001 и 0.105E+0002, что по значению одно и тоже. Последняя форма - это нормализованная

FloatToStrF есть? Им удобней отображать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 29.10.2013 в 12:27.
Аватар вне форума Ответить с цитированием
Старый 29.10.2013, 12:24   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,596
По умолчанию

Зачем что-то возводить в степень? Вам же объяснили, что 4.09090000000000E+0004 и 40909 - это одно и тоже, просто разная форма записи.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приведение типов _PROGRAMM_ Общие вопросы C/C++ 2 10.10.2013 19:15
приведение типов??? nikozavr C# (си шарп) 1 14.05.2011 22:29
Приведение пользовательских типов peplenko Общие вопросы C/C++ 6 18.04.2011 12:59
С - приведение типов onewho Общие вопросы C/C++ 3 21.11.2010 00:12
Приведение типов в Qt mike_tihomirov Qt и кроссплатформенное программирование С/С++ 1 19.06.2010 13:14