La forma más segura de comparar std::complejo<double> con Cero con cierta precisión Epsilon?

0

Pregunta

Necesito de forma segura de verificación es mi número complejo con un cero (o muy similares). Cómo puedo hacer para números de punto flotante?

Puedo usar algo como:

std::complex<double> a;
if(std::abs(std::real(a)) <= std::numerical_limits<double>::epsilon() && std::abs(std::imag(a)) <= std::numerical_limits<double>::epsilon())
{
//...
}

Voy a dividir los valores de una y no quiero llegar a ser la INF como resultado.

2

Mejor respuesta

1

Has probado std::fpclassify de <cmath>?

if (std::fpclassify(a.real()) == FP_ZERO) {}

Para comprobar si real y la parte imaginaria de un complejo de 0:

if (a == 0.0) {}

Como se ha mencionado por @eerorika un largo tiempo antes que yo. Una respuesta que rechazó.
De punto flotante de precisión de redondeo, de izamiento de la bandera, subnormal es todo de implementación definido (Ver: [basic.fundamentales], [soporte.límites.general], y C ISO 5.2.4.2.2).

2021-12-04 22:11:41

¿Cómo es que esto funciona? ¿Por qué nos marque sólo la parte real de un número. Es la división de RealNumber/ImaginaryNumber o ImaginaryNumber/OtherImaginaryNumber prohibida?
Robotex

Yo no considerar todo lo que. El complejo de la teoría de los números no es realmente fresco en mi cabeza. No estoy seguro, pero si la parte imaginaria es 0: no es sólo un número real?
ViralTaco_

"no es sólo un número real" -- sí, en este caso tenemos un error si la parte real es cero también. Pero le pregunté sobre el caso cuando la parte real es cero y la imaginaria no.
Robotex
1

Necesito verificar mi número complejo como un cero. Cómo puedo hacer para números de punto flotante?

Se puede comparar con la de un punto flotante literal con valor de 0. Usted puede utilizar un literal entero con std::complex<double>. Ejemplo:

a == 0.0

Puedo usar algo como ...

Lo que has demostrado no comparar si el número complejo es igual a cero; compara si el número complejo está cerca de cero. Esto puede ser razonable la operación, por ejemplo, en el caso de que el número es el resultado de un cálculo con un margen de error, y desea saber si el resultado está dentro del margen. Pero es una operación independiente

Si que es una buena manera de comparar si el número es cercano a cero depende del caso de uso. Por ejemplo, epsilon no es necesariamente el mejor umbral de "cerca". Otra cosa que usted puede considerar es si usted debe comparar std::abs(a) para el umbral en lugar de comparar los componentes por separado, es decir, si debe utilizar la distancia euclídea en lugar de manhattan distancia.

2021-12-02 08:31:27

Curiosidad: ¿por Qué "no Se puede utilizar un literal entero" ? No válido para hacer complejos op int?
chux - Reinstate Monica

@chux-ReinstateMonica puede utilizar literal entero si usted utiliza std::complex<int> por ejemplo, pero OP std::complex<double>.
eerorika

Interesante. LSNED
chux - Reinstate Monica

"Lo que ha demostrado no comparar si el número complejo es igual a cero; compara si el número complejo está cerca de cero." - Es la única manera de comparar flotante puntos. No es imposible comparar es el número de punto flotante exactamente cero
Robotex

@Robotex Que no es verdad. Lo que he mostrado que es posible, y no comparar si el número de punto flotante es exactamente cero.
eerorika

@eerorika la declaración que casi nunca será verdadero
Robotex

@Robotex Es siempre cierto, con sólo teórica excepción de algunas raro tipo de punto flotante de que no tiene la representación para el cero.
eerorika

@eerorika ¿lo ha intentado? Usted no puede garantizar que el valor de la variable es exactamente el mismo valor que usted espera si es de punto flotante 0.30000000000000004.com 0.1 + 0.2 = 0.30000000000000004
Robotex

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................