В C, комплексные числа с плавающей точкой или двойной и имеют тот же проблема, как канонических типов:Как сравнить два комплексных номера?
#include <stdio.h>
#include <complex.h>
int main(void)
{
double complex a = 0 + I * 0;
double complex b = 1 + I * 1;
for (int i = 0; i < 10; i++) {
a += .1 + I * .1;
}
if (a == b) {
puts("Ok");
}
else {
printf("Fail: %f + i%f != %f + i%f\n", creal(a), cimag(a), creal(b), cimag(b));
}
return 0;
}
Результат:
$ clang main.c
$ ./a.out
Fail: 1.000000 + i1.000000 != 1.000000 + i1.000000
я попробовать этот синтаксис:
a - b < DBL_EPSILON + I * DBL_EPSILON
Но компилятор ненавидит его:
main.c:24:15: error: invalid operands to binary expression ('_Complex double' and '_Complex double')
if (a - b < DBL_EPSILON + I * DBL_EPSILON) {
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Это последние работы хорошо, но это немного привередлив:
fabs(creal(a) - creal(b)) < DBL_EPSILON && fabs(cimag(a) - cimag(b)) < DBL_EPSILON
Вам не нужно брать абсолютное значение 'creal (a) - creal (b)'? Точно 'cimag..'? –
Несомненно, единственный способ сравнить два комплексных числа - сравнить их величину, модуль. –
... и сравнение для равенства будет иметь ту же проблему, что и любые другие сравнения с плавающей запятой, см. [Является ли математика с плавающей запятой?] (Http://stackoverflow.com/questions/588004/is-floating-point-math -broken) –