Программистское

Dec 14, 2013 23:17

Далее под катом немного кода на СИ и одна проблема. Если у вас есть немного свободного времени и вы программист, то я буду очень рад помощи.
Помочь... )

Leave a comment

goliafffff December 15 2013, 06:49:02 UTC
По-моему очевидно, что ошибки меня не устраивают - иначе не писал бы этот пост. И мне тоже кажется, что проблема с кодом, а не с исследуемой моделью. Но также вполне естественно, что при анализе происходящего и поиске ошибок, я принимаю во внимание свойства исследуемой системы. Естественно, что хочется получить работающий код, который на разных компьютерах даёт одинаковый результат.

3.14/10.0 написал в целях упрощения, для текущей задачи этот параметер не принципиален, могу заменить обратно на M_PI. Почему 3.14/10.0 не делиться на двоичных машинах? Что будет в результате такого деления?

Если FPP не даёт хорошей точности, то что можно использовать вместо него? Что такое четыре режима округления?
Буду признателен, если вы ответите на мои вопросы или хотя бы дадите ссылки, где про это можно прочитать.

Пока что я только нашёл два обсуждения на stackoverflow:
http://stackoverflow.com/questions/2284860/how-does-c-compute-sin-and-other-math-functions
http://stackoverflow.com/questions/345085/how-do-trigonometric-functions-work

Reply

pphantom December 15 2013, 11:18:07 UTC
При вычислении 3.14/10.0*ds.t возникают ошибки округления (число 3.14 непредставимо в виде конечной двоичной дроби), и результат "прыгает" в зависимости от того, в какую сторону будет округляться итог. А Вы в результате изучаете особенности не отображения, а архитектуры компьютера. :)

Собственно, это предположение можно легко проверить. Я соорудил программку, которая считает первое отображение (в котором никаких синусов нет), но с разной точностью (двойной и четверной). Разница результатов начинается, естественно, с 10^{-16}, но уже за несколько десятков итераций доходит до 10^0.

Так что Вам просто повезло - первое отображение все используемые компьютеры считают одинаково (и, по-видимому, одинаково неверно). Во втором же случае появляются какие-то мелкие различия, которые приводят к разным результатам.

Reply

ex_juan_gan December 15 2013, 17:25:07 UTC
FPP, последний раз, когда я это исследовал, давал всего 32 бита мантиссы на тригонометрических функциях.
Четыре режима округления (ими можно управлять) - это к плюс бесконечности, к минус бесконечности, к нулю, к ближайшему чётному.

Вы делите на 10, т.е. на 2 и на 5. На 2 делить ошибки нет, а на 5 деление получается неточное, потому что это не степерь двойки, дробь бесконечная. и там остаток отбрасывается.

Reply


Leave a comment

Up