![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с плавающей запятой
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