Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с плавающей запятой


Bolg ©   (2012-07-19 16:42:00) 

Вопрос такой: почему эта строчка в моем проекте выдает 0 а в пустой программе больше 0?
floattostr(incsecond(now)-now)


Омлет   (2012-07-20 15:25:00) [1]

Я уже как-то сетовал: http://delphimaster.net/view/15-1305794033


AV   (2012-07-20 14:44:00) [2]


> Inovet ©   (20.07.12 14:32) [15]


:)

function CalcAddYear (NumY: integer);
begin
  Sleep(NumY*365*24*60*60);
  Result := now;
end;


Anatoly Podgoretsky   (2012-07-20 14:44:00) [3]

> Inovet  (20.07.2012 14:32:15)  [15]

Кто к нас с Suspend придет, тот от него и погибнет


Inovet   (2012-07-20 14:32:00) [4]

> [14] Anatoly Podgoretsky ©   (20.07.12 14:22)
> Потому что он убивается формулой now-now

А если между вызовами Now() сделать процессу Suspend на год? Ну так вот иногда попадёт.


Anatoly Podgoretsky   (2012-07-20 14:22:00) [5]

Потому что он убивается формулой now-now


Inovet   (2012-07-20 14:15:00) [6]

> [11] Anatoly Podgoretsky ©   (20.07.12 12:43)
> Не может быть

Это почему не может?


AV   (2012-07-20 13:00:00) [7]


> Inovet ©   (20.07.12 12:15) [10]

день уже
> Не может быть

имхо.


Anatoly Podgoretsky   (2012-07-20 12:43:00) [8]

Не может быть


Inovet   (2012-07-20 12:15:00) [9]

> [9] AV ©   (20.07.12 09:49)

Так и год может быть.


AV   (2012-07-20 09:49:00) [10]

есть

var
 R: Double;
begin
 repeat
   R := now-now;
   if R <> 0 then
     mmo1.Lines.Add(FloatToStr(R));
 until mmo1.Lines.Count > 10;

-1,85187673196197E-7
-1,85187673196197E-7
-1,85187673196197E-7
-1,85180397238582E-7
-1,73611624632031E-7
-1,73611624632031E-7
-1,85187673196197E-7
-1,85187673196197E-7
-1,73611624632031E-7
-1,85187673196197E-7


Германн   (2012-07-20 02:23:00) [11]


> Bolg   (19.07.12 19:47) [7]
>
> Ну это был пример, а сам рабочий код выглядит так:
> 1
>  
> time.Now:=time.Now+time.Speed*timegap;
>
> Где time.Speed принимает значения
> 1
> 2
> 3
> 4
>  
> EncodeTime(0,0,1,0)
> EncodeTime(0,1,0,0)
> EncodeTime(1,0,0,0)
> EncodeTime(23,59,59,999)
>
> Работает норм
>

А в чём тогда проблема?


Bolg   (2012-07-19 19:47:00) [12]

Ну это был пример, а сам рабочий код выглядит так:
time.Now:=time.Now+time.Speed*timegap;
Где time.Speed принимает значения
EncodeTime(0,0,1,0)
EncodeTime(0,1,0,0)
EncodeTime(1,0,0,0)
EncodeTime(23,59,59,999)

Работает норм


Anatoly Podgoretsky   (2012-07-19 19:01:00) [13]


> есть какие-то подводные камни?
> floattostr(incsecond(now)-now);

Конечно ведь тут вызов два раза не реентерабельной фукции, результат непредсказуемый, зависит от погоды на Марсе


Bolg   (2012-07-19 18:53:00) [14]

Я так понял именно DirectX ставит меньшую точность и не возвращает ее назад


Dimka Maslov   (2012-07-19 18:09:00) [15]


> есть какие-то подводные камни?


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


Inovet   (2012-07-19 17:53:00) [16]

> [2] Bolg   (19.07.12 17:19)
> есть какие-то подводные камни?

Конечно, потом будет в другом месте не так, как ожидается работать.


Bolg   (2012-07-19 17:19:00) [17]

Спасибо, так работает
Set8087CW(Get8087CW or $0100);
floattostr(incsecond(now)-now);

есть какие-то подводные камни?


Германн   (2012-07-19 17:04:00) [18]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


Наверх

Титульная страница Поиск, карта сайта Написать письмо