2010-04-12 8 views
7

mientras hacía alguna tarea en mi muy extraño libro de C++, which I've been told before to throw away, tenía un segmento de código muy peculiar. Sé que los deberes siempre arrojan un "misterio" extra para confundir dos líneas después de un ciclo for-loop de declaración única. Pero estoy confundido porque parece servir para algo real.sqrt (int_value + 0.0) - ¿Tiene un propósito?

Básicamente es así:

int counter=10; 
... 
if(pow(floor(sqrt(counter+0.0)),2) == counter) 
... 

Estoy interesado en esta parte en especial:

sqrt(counter+0.0) 

¿Hay algún propósito a la +0.0? ¿Es esta la forma de poormans de hacer un reparto estático a un doble? ¿Esto evita alguna advertencia de compilación en algún compilador que no uso? Todo el programa imprimió exactamente lo mismo y compilado sin advertencias en g ++ cada vez que omití la parte +0.0. Tal vez no estoy usando un compilador lo suficientemente extraño?

Editar:

Además, ¿gcc simplemente romper estándar y no crea un error de referencia ambigua desde sqrt puede tomar 3 tipos diferentes de parámetros?

[[email protected]~/projects/homework1] $ cat calc.cpp 
#include <cmath> 

int main(){ 
    int counter=0; 
    sqrt(counter); 
} 
[[email protected]~/projects/homework1] $ g++ calc.cpp 
/usr/lib/libstdc++.so.47.0: warning: strcpy() is almost always misused, please use strlcpy() 
/usr/lib/libstdc++.so.47.0: warning: strcat() is almost always misused, please use strlcat() 
[[email protected]~/projects/homework1] $ 

Además, aquí es la parte pertinente de mis librerías del sistema cmath no estoy demasiado interesado en las plantillas, así que no estoy seguro de lo que está haciendo

using ::sqrt; 

    inline float 
    sqrt(float __x) 
    { return __builtin_sqrtf(__x); } 

    inline long double 
    sqrt(long double __x) 
    { return __builtin_sqrtl(__x); } 

    template<typename _Tp> 
    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
         double>::__type 
    sqrt(_Tp __x) 
    { return __builtin_sqrt(__x); 
+7

La verdadera pregunta es, ¿por qué no has tirado el libro? :) –

+0

@Justin se requiere para un título o definitivamente quemaría cada página. – Earlz

Respuesta

13

¿Es este el poormans forma de hacer un elenco estático a un doble?

Sí.

No se puede llamar sqrt con un int como parámetro, ya que toma un sqrtfloat, double o long double. Tiene que convertir el int a uno de esos tipos, de lo contrario, la llamada es ambigua.

+1

, pero ¿por qué? ni siquiera es necesario en este caso. – Earlz

+5

@Earlz: No sé por qué alguien recomendaría usar '+ 0.0'. Lo único que tiene a su favor es que es menos de escribir que 'static_cast ' o '(double)', pero esa no es una buena razón para usarlo. –

+0

@James, ¿por qué g ++ no da un error o una advertencia acerca de esto, entonces? Ver mi edición – Earlz

0

el motivo del contador de expresión + 0.0 es convertirlo explícitamente en un número real. si no agregamos 0.0, el compilador realizará la conversión implícita

0

Es solo otra manera de convertir a un doble. Esto es porque sqrt no acepta ints. Como un doble es más alto, fusionará el int en el 0.0. De la misma forma se puede hacer para convertir de (int, double, float) a string.

double n = 0;

cadena m = "" + n;

+2

Creo que estás pensando en algún otro lenguaje de programación; no puedes hacer eso en C++. –

Cuestiones relacionadas