пытаясь разделить комплексные числа, деление на ноль - PullRequest
2 голосов
/ 05 января 2011

Я пытаюсь в программе ниже разделить комплексные числа, она работает для комплексных чисел, но не когда знаменатель действителен (т. Е. Комплексная часть равна нулю).Деление на ноль происходит в этой строке ratio = b->r / b->i ;, когда сложная часть b->i равна нулю (в случае реального знаменателя).

Как мне обойти это?и почему программист сделал это, вместо более простого правила для сложное деление

Правило Википедии, кажется, лучше, и здесь не будет ошибки деления на ноль.Я что-то пропустил?Почему программист не использовал формулу Википедии ??

Спасибо

<code>/*! @file dcomplex.c
 * \brief Common arithmetic for complex type
 *
 * <pre>
 * -- SuperLU routine (version 2.0) --
 * Univ. of California Berkeley, Xerox Palo Alto Research Center,
 * and Lawrence Berkeley National Lab.
 * November 15, 1997
 *
 * This file defines common arithmetic operations for complex type.
 * 
* / #include#включают#включают#include "slu_dcomplex.h" / *!\ краткое комплексное деление c = a / b * / void z_div (двойной комплекс * c, двойной комплекс * a, двойной комплекс * b) {двойное отношение, ден;double abr, abi, cr, ci;if ((abr = b-> r) <0.) abr = - abr;if ((abi = b-> i) <0.) abi = - abi;if (abr <= abi) {if (abi == 0) {fprintf (stderr, "z_div.c: деление на ноль \ n");Выход (-1);} ratio = b-> r / b-> i;den = b-> i * (отношение 1 + коэффициент *);cr = (a-> r * ratio + a-> i) / den;ci = (a-> i * ratio - a-> r) / den;} else {ratio = b-> i / b-> r;den = b-> r * (отношение 1 + коэффициент *);cr = (a-> r + a-> i * ratio) / den;ci = (a-> i - a-> r * ratio) / den;} c-> r = cr;c-> i = ci;}

Ответы [ 3 ]

1 голос
/ 05 января 2011

Похоже, что оригинальный программист гарантировал, что ratio окажется в диапазоне от 0 до 1 (включительно), вероятно, для обеспечения достаточной точности.

Прямое кодирование алгоритма в Википедии выглядит так, как будто есть опасность получить очень большие делители.

Также, насколько я могу судить, следующий тест:

   if (abi == 0) {
        fprintf(stderr, "z_div.c: division by zero\n");
        exit(-1);
   }   
Значение

может быть истинным только в том случае, если оба значения abi и abr равны нулю, поэтому вы окажетесь в реальной ситуации деления на ноль.

(В этот момент оба abi и abr были вынуждены быть неотрицательными, и этот путь к коду получен, только когда (abr <= abi)).

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

0 голосов
/ 05 января 2011

Вам нужно использовать эту библиотеку?C99 имеет тип complex.

0 голосов
/ 05 января 2011

Если бы все написали все идеально в первый раз, то я думаю, что многие из нас были бы безработными.

Использование кода другого человека всегда несет риск столкновения с такими проблемами.По этой причине я бы рекомендовал использовать что-то вроде реализации Apache (std :: complex) .Большинство их вещей довольно хорошо хранятся и проверяются.

...