Ситуация: Я выполняю одинаковые вычисления на двух разных языках (C ++ & Scilab). Результаты немного различаются при использовании трансцендентных функций, таких как sin () и exp (). Я предполагаю, что это небольшое различие связано со следующим:
Стандарт IEEE не требует, чтобы трансцендентные функции были точно округлены из-за дилеммы производителя стола.
Источник: Что каждый ученый должен знать об арифметике с плавающей точкой.
Вопрос: Есть ли способ для меня, чтобы определить, какой (если любой) из этих языков является более точным в моих конкретных расчетах, без самостоятельно выполнять расчеты?
Я думал о том, чтобы просто поместить расчеты в Wolfram Alpha и посмотреть, какое из этих двух значений точно дольше. К сожалению, я жду этот вопрос (о точности Wolfram Alpha), чтобы ответить.
Примечание: после публикации этого вопроса я все еще собираюсь попробовать упомянутый выше способ Wolfram, но есть ли какой-то более простой и эффективный способ определить, какой из двух языков выдает более точные результаты?
Технически говоря, существует предварительное обсуждение этого вопроса: точность отличается от точности. Точность — это измерение того, насколько близко ваш расчет к истинному значению, каким бы он ни был; Точность — это измерение того, насколько близко много вычислений друг к другу. Вы понимаете лучше, если вы думаете с точки зрения распределения вероятностей набора результатов расчета. Следовательно, вы можете иметь низкую точность, например, с высокой точностью. Название вашего поста о точности, но в тексте вы упоминаете точность.
Я думаю, ты имел в виду точность.
Тем не менее, нет общего ответа.
Есть много методов, которые вы можете использовать, на самом деле бесконечные алгоритмы могут соответствовать вашим потребностям.
Тебе нужно:
Почему это? Вы должны оценить свои sin(x)
с большей точностью, чем два результата, которые вы хотите сравнить. А алгоритмы для трансцендентных функций являются последовательными. Таким образом, вы должны оценить, как ошибка алгоритма, а в некоторых случаях и ошибки представления, влияют на ваши вычисления. На этом этапе реализуйте метод по вашему выбору и оцените расстояние между вашим результатом и двумя другими, убедившись, что общая ошибка, влияющая на ваш результат, тем не менее, меньше некоторой контролируемой константы.
В качестве примера, оценивая exp(10)
может быть сделано с использованием обычного экспоненциального разложения Тейлора около нуля и с использованием многих терминов; но если вы используете тот же метод для exp(-10)
, вы можете потерпеть неудачу, так как его расширение имеет чередующиеся знаковые условия. Это означает, что у вас могут быть эффекты отмены, которые могут накапливаться. Вы не хотите этого, иначе вы можете быть точными, но предвзятыми, неточными в ваших расчетах.
Обычно используется GMP, потому что он предназначен для этого.
Так, например, вы можете обнаружить, что Scilab является лучшим в расчете exp(-10)
и C ++ в exp(10)
только потому, что они могли использовать разные реализации.
В итоге: используйте GMP и ищите точный алгоритм. Это может работать или быть единственным решением, если вам нужен точный результат некоторого конкретного суммирования Фурье или ряда, в которых, например, должны оцениваться другие трансцендентные термины.
Но если вам просто нужен этот ответ для простого sin
а также exp
надо искать таблицы, и все тут.
Если вам нужна постоянная точность трансцендентных математических функций, я предлагаю вам написать свои собственные.
Существуют различные методы для реализации функций, таких как sin
, Некоторые используют таблицу значений (например, платформы небольших встроенных систем) для аппаратных расчетов.
Реализация трансцендентных математических функций обычно зависит от языкового разработчика.
Кстати, общая реализация — это нечто среднее между пространством, скоростью и точностью. Высокоточная версия может потребовать много места или много времени.
По крайней мере, если у вас есть собственная реализация, вы можете контролировать точность, а не догадываться о точности реализации языка.