【发布时间】:2011-01-05 02:31:54
【问题描述】:
我正在尝试下面的程序来划分复数,它适用于复数,但当分母为实数时(即复数部分为零)则无效。当复数部分b->i 为零(在实分母的情况下)时,在这一行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。 -
@Gman。它是一个 C 程序。请参阅评论的标题,即 dcomplex.c。 Op 应该删除 c++ 标签
-
我相信这里可能存在边缘案例错误。老实说,似乎程序员并不是真正的数学家,这没有任何意义。 PS 我同意汤姆的观点。
-
@Tom:哦,我发誓它是 C++...(哦,原来如此。阅读标签,我在想什么。)
-
这是伯克利的 SuperLU 矩阵求解器,我想是在 1997 年开发的。我想一个错误不会持续那么久。
标签: c complex-numbers divide-by-zero