2016-06-20 4 views
0

Я в процессе преобразования программы из кода Scilab в C++, и для меня важно поддерживать результаты, созданные Scilab.Если я пытаюсь воспроизвести программу на другом языке. Нецелесообразно использовать больше точности?

Я знаю, что Scilab использует двойную точность IEEE 754 и что C++ удваивает (хотя это и не требуется) реализованы аналогичным образом.

ли тогда плохая идея использовать более высокую точность (напримерlong double) в C++, если я пытаюсь точно соответствовать результатам Scilab?

Например: Можно ли для Scilab, чтобы вычислить число быть 0.1234, тогда как в C++ с использованием долго удваивает число будет 0.12345. Таким образом, потенциально создавая дисперсию, которая привела бы к двум программам, производящим разные результаты (хотя и более точные на C++).

+2

Я готов поспорить, что вы никогда не получите точно таких же результатов. Но вам действительно нужно? –

+0

@ JesperJuhl Технически говоря, мне не нужны точные результаты. Проблема в том, что в моей программе много циклов, и если начальный цикл отключен даже малой фракцией (какой она есть), конечная разница становится значительной. –

+0

Если разница в конце значительна, это не означает, что ваша программа требует большей точности, чем позволяет встроенная с плавающей запятой? – Galik

ответ

1

Да, это совершенно возможно.

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

Более того, как уже отмечалось в комментариях: не ожидайте, что ваша программа на C++ даст те же результаты, что и программа Scilab, особенно если это критическое значение для небольших изменений. Вот почему большинство численных симуляций только точные до определенного предела, прежде чем они начнут производить «неправильные» результаты.

В другом случае, чтобы дать вам полезный совет, C++ имеет очень полезный вариант typedefs. Используйте typedef, например typedef long double myFloatType, и используйте только myFloatType для своих расчетов (подумайте о лучшем имени, которое на самом деле больше говорит о том, что оно используется здесь!). Затем вы можете легко изменить его, просто изменив одну строку кода и сравните результаты.

Если разница значительна, возможно, стоит подумать о лучшем алгоритме.