2014-12-14 2 views
0

У меня проблема с закруглением, которое MATLAB делает (автоматически). В моем цикле время увеличивается на 0,05 секунды каждый раз, или если есть особое обстоятельство, оно будет добавлять значение времени между ними. Поэтому, чтобы получить следующее значение, я использовалокругление в matlab

floor((t(n-1)/dt)*dt+dt 

для расчета следующего значения времени. Поскольку floor ((t (n-1)/dt) вычислил количество шагов в 0,05 секунды, и затем он будет снова умножаться с этим временным интервалом и добавит еще один шаг, чтобы получить следующее значение. Даже если текущее время не является кратным 0,05, следующий шаг будет. Точно то, что я хотел. Однако Matlab делает некоторое округление, я не понимаю, см. снимок экрана ниже. Я даже добавил допуск 10^-14 для противодействия округлениям , но когда время станет больше, округление станет больше, чем допуск.

Как вы можете видеть на скриншоте, деление 32.05 на 0.05 дает 640.9999999999999 вместо 641. И в моем сценарии это заставляет цикл продолжать навсегда, так как это перекрывается до 640, то есть время больше не будет увеличиваться и будет оставаться на уровне 32,05 в каждом цикле.

* Мне нужно 10 репутации по крайней мере, для изображения, так вот ссылка: http://i.imgur.com/E9freYH.jpg

Edit: enter image description here

Есть ли способ решить эту проблему?

+0

Вместо добавления '10^-14' попробуйте добавить' eps (t (n-1)) 'и увидеть, как это разрешает проблему. – Divakar

+0

Что я нахожу странным в ваших расчетах, так это то, что простая команда 32.05/0.05 уже дает неточный результат. Это также происходит, когда вы перезапускаете Matlab и затем вводите это как свою первую команду (то есть без первого запуска какого-либо скрипта вообще)? –

+0

нет, это только усугубляет ситуацию. Цикл for уже находится в бесконечной петле на 0,30 секунды. esp (t (n-1)) приводит к 5.551115123125783e-17, который намного меньше, чем старый допуск. ----------------------------------- , когда я перезапускаю матлаб, 32.05/0.05 дает точный результат 461, но после запуска скрипта он будет продолжать давать 460.99999999999, пока я его не перезапущу. – user3446867

ответ

2

Дивакар дал мне намек на правильный ответ. она была решена с помощью

t(n) = floor((eps(t(n-1))+t(n-1))/dt)*dt+dt; 

Но, скорее всего, альтернативным решением было бы предложение о Менди Barel, чтобы преобразовать время в миллисекундах, так что все числа являются целыми числами. Спасибо всем за помощь, и этот вопрос сейчас решен.

Смежные вопросы