以下のプログラムでは複素数を除算しようとしていますが、複素数に対しては機能しますが、分母が実数の場合(複合部分がゼロの場合)は機能しません。複素数部分b->i
がゼロ(実数分母の場合)のとき、0で除算がこの行に発生します。ratio = b->r/b->i ;
複素数を除算しようとするとゼロで除算する
どうすればこの問題を回避できますか? complex division
ウィキペディアのルールはより良いように見えますが、ここでゼロエラーによる除算は発生しません。私は何か見落としてますか?なぜプログラマはウィキペディアの式を使用しなかったのですか?
おかげ
/*! @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.
* </pre>
*/
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "slu_dcomplex.h"
/*! \brief Complex Division c = a/b */
void z_div(doublecomplex *c, doublecomplex *a, doublecomplex *b)
{
double ratio, den;
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: division by zero\n");
exit(-1);
}
ratio = b->r/b->i ;
den = b->i * (1 + ratio*ratio);
cr = (a->r*ratio + a->i)/den;
ci = (a->i*ratio - a->r)/den;
} else {
ratio = b->i/b->r ;
den = b->r * (1 + ratio*ratio);
cr = (a->r + a->i*ratio)/den;
ci = (a->i - a->r*ratio)/den;
}
c->r = cr;
c->i = ci;
}
プログラマに尋ねるそれだけでなく、 'std :: complex'を使用してください。 – GManNickG
@Gman。そのCプログラム。コメントの見出しであるdcomplex.cを参照してください。 OpはC++タグ – Tom
を削除する必要があります。プログラマが実際に数学者ではなかったように思えます。 PS私はTomに同意します。 –