Разве это не должно дать мне текущую дату / время в секундах? - PullRequest
0 голосов
/ 14 сентября 2011

Я хочу вычислить значение колебательного смещения на основе текущего времени в секундах, чтобы любой объект мог вызвать этот метод и получить возвращенное смещение, синхронизированное с любым другим объектом, который вызывает тот же метод.

Это мой установщик для свойства locationOffset:

- (float)locationOffset
{
    float currentTime = [[NSDate date] timeIntervalSince1970];
    locationOffset = sinf(currentTime);
    CCLOG(@"--- current time = %1.9f, location offset = %1.1f", currentTime, locationOffset);

    return locationOffset;
}

Я называю это 60 Гц, и выход выглядит так:

--- current time = 1316013568.000000000, location offset = -0.1

... и так и останется. Должно ли все после десятичного числа быть нулем?

Я ожидаю, что смогу настроить частоту, масштабируя currentTime и «длину волны», масштабируя смещение, но мне просто нужно, чтобы мой синусоидальный locationOffset качался взад-вперед в зависимости от времени.

Похоже, что смещение местоположения должно циклически изменяться от -1 до 1 каждые 2pi секунды.

РЕДАКТИРОВАТЬ: Добавление метода, который работает сейчас, как и должно.

- (float)locationOffset
{
    double currentTime = [[NSDate date] timeIntervalSinceReferenceDate];
    locationOffset = sin(2.0f*currentTime) * 12.0f;
//    CCLOG(@"--- current time = %1.9f, location offset = %1.1f", currentTime, locationOffset);

    return locationOffset;
}

Он циклически повторяется каждые пи-секунды и имеет величину +/- 12.

1 Ответ

1 голос
/ 14 сентября 2011

Да, ваша проблема в том, что значение float имеет только около 7 значащих цифр.Вам даже не хватает точности, чтобы правильно выразить целочисленное значение 1316013568, поэтому вы эффективно вводите одно и то же значение в sinf снова и снова.Придерживайтесь значений double и используйте функцию sin двойной точности или масштабируйте число до значения, меньшего, чем примерно 6 целых цифр, перед преобразованием в число с плавающей точкой.

...