Как устранить числовую нестабильность в Floor(t / dt) * dt != t?C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Как устранить числовую нестабильность в Floor(t / dt) * dt != t?

Сообщение Гость »

У меня есть два float t и dt. Типичные значения: t = 1 и dt = .01f. Я хочу выполнить функцию foo для каждого «времени» от 0 до t с размером шага dt. Если случится так, что t не делится на dt, мне нужно также вызвать foo для последней точки времени t.
Вот что я делаю:

Код: Выделить всё

std::size_t const k = static_cast(std::floor(t / dt));
for (std::size_t i = 0; i < k; ++i)
foo(i * dt, dt);

float const s = k * dt,
h = t - s;
if (h > 0)
foo(s, h);
Как видите, мне также нужно передать приращение dt (соответственно h) в foo.
Теперь я заметил, что из-за числовой неточности h > 0, даже если t делится на dt, и в этом случае выполняется foo с крошечным h во втором аргументе. Это то, чего мне бы очень хотелось избежать. Есть ли возможность написать код в более стабильной числовой форме, чтобы он не выполнял ветвь h > 0, когда t делится на dt?

Подробнее здесь: https://stackoverflow.com/questions/781 ... rt-dt-dt-t
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»