studio programacion para móviles libro edición desarrollo curso cuenta clase bancaria aplicaciones c++ math language-design complex-numbers

programacion - ¿Por qué C++ ordena que ese complejo solo se instancia para doble flotante, doble o larga?



manual de programacion android pdf (2)

No puede implementar correctamente muchas de las operaciones std::complex en enteros. P.ej,

template <class T> T abs(const complex<T> &z);

para un complex<long> no puede tener T = long valor de retorno T = long cuando los números complejos se representan como pares (reales, imag), ya que devuelve el valor de sqrt(pow(z.real(), 2) + pow(z.imag(), 2)) . Solo algunas de las operaciones tendrían sentido.

Peor aún, el constructor nombrado polar no puede hacerse confiable sin romper el constructor predeterminado y viceversa. El estándar debería especificar que los "enteros complejos" son enteros gaussianos para que sean de alguna utilidad, y que uno de los constructores está severamente roto.

Finalmente, ¿cómo le gustaría que se sirva su "división entera compleja" y le gustaría un "resto complejo" con eso? :)

Resumiendo, creo que sería más sensato especificar un tipo de gaussian_int<T> separado con unas pocas operaciones que soporte de injerto para la integral T en std::complex .

De acuerdo con la especificación ISO de C ++, §26.2 / 2:

El efecto de instanciar el complex plantilla para cualquier tipo que no sea float , double o long double no está especificado.

¿Por qué los autores estándar agregarían explícitamente esta restricción? Esto hace que no se especifique, por ejemplo, qué sucede si hace complex<int> o un complex<MyCustomFixedPointType> y parece una restricción artificial.

¿Hay alguna razón para esta limitación? ¿Hay una solución alternativa si desea crear instancias complex con su propio tipo personalizado?

Principalmente estoy haciendo esta pregunta debido a esta pregunta anterior , en la que el OP estaba confundido en cuanto a por qué los abs estaban dando salidas extrañas para complex<int> . Dicho esto, esto todavía no tiene sentido dado que también podríamos querer hacer números complex partir de tipos de puntos fijos, números reales de mayor precisión, etc.


Probablemente por compatibilidad con las funciones de ayuda. Por ejemplo:

template<class T> T abs (const complex<T>& x);

Si T == int , abs devolvería int , lo que significaría una pérdida masiva de precisión.