iOS - реализация комплексных чисел - PullRequest
3 голосов
/ 16 апреля 2011

В качестве продолжения этого вопроса :

Я занимался реализацией приложения калькулятора, используя Поддержка комплексных чисел Apple , когда я заметил, что еслиодин рассчитывает, используя эту поддержку, один заканчивается следующим:

(1 + i) ^ 2 = 1.2246063538223773e-16 + 2i

Конечно, правильное тождество: (1 + i)^ 2 = 2i.Это конкретный пример более общего явления - ошибки округления могут быть действительно раздражающими, если они округляют часть, которая должна быть нулевой, к чему-то, что немного ненулевое.

Предложения о том, как с этим бороться?Я мог бы реализовать целочисленные степени комплексных чисел другими способами, но общая проблема останется, и мое решение само может вызвать другие несоответствия.

1 Ответ

3 голосов
/ 16 апреля 2011

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

Обычно я использую FLT_EPSILON, чтобы помочь мне и с такими вещами.

#define fequal(a,b) (fabs((a) - (b)) < FLT_EPSILON)
#define fequalzero(a) (fabs(a) < FLT_EPSILON)

С ними вам может понравиться такая функция (не проверено)

inline void froundzero(a) { if (fequalzero(a)) a = 0; }

Сложная версия оставлена ​​читателю как упражнение: D

...