2011-09-15 12 views
12

Quiero considerar el código. La primera es:Diferencia entre sqrtf y sqrtf

#include <iostream> 
#include <cmath> 
#include <math.h> 
using namespace std; 
int main() { 
    int s = 25; 
    cout << sqrt(s) << endl; 
    return 0; 
} 

me dio este error:

>c:\users\datuashvili\documents\visual studio 2010\projects\training\training\training.cpp(9): error C2668: 'sqrt' : ambiguous call to overloaded function 
1>   c:\program files\microsoft visual studio 10.0\vc\include\math.h(589): could be 'long double sqrt(long double)' 
1>   c:\program files\microsoft visual studio 10.0\vc\include\math.h(541): or  'float sqrt(float)' 
1>   c:\program files\microsoft visual studio 10.0\vc\include\math.h(127): or  'double sqrt(double)' 
1>   while trying to match the argument list '(int)' 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Si añado tipo float entre paréntesis delante de s, así:

#include <iostream> 
#include <cmath> 
#include <math.h> 
using namespace std; 

int main() { 
    int s = 25; 
    cout << sqrt((float)s) << endl; 
    return 0; 
} 

llegué como yo adivinaría, 5. Y otra variante es que en lugar de sqrt, si escribo sqrtf:

#include <iostream> 
#include <cmath> 
#include <math.h> 
using namespace std; 

int main(){ 
    int s=25; 
    cout << sqrtf((float)s) << endl; 
    return 0; 
} 

También me dio 5.

¿Cuál es la diferencia entre ellos? ¿Significa que sqrtf es lo mismo que sqrt para el tipo de flotante?

+0

Pero no obtendrá un error, compílelo en g ++ (compilador GNU) – vivek

Respuesta

15

Aquí es a page on MSDN documentation for sqrt() and sqrtf(), que explica la diferencia:

sqrt, sqrtf

calcula la raíz cuadrada.

double sqrt(
     double x 
    ); 
    float sqrt(
     float x 
    ); // C++ only 
    long double sqrt(
     long double x 
    ); // C++ only 
    float sqrtf(
     float x 
    ); 

Parámetros

x: valor

Observaciones de punto flotante no negativo

C++ permite la sobrecarga, por lo que los usuarios pueden llamar a sobrecargas de sqrt que tome flotador o largo doble tipos. En un programa C, sqrt siempre toma y devuelve el doble.

Valor de retorno

La función sqrt devuelve la raíz cuadrada de x. Si x es negativo, sqrt devuelve un valor indefinido, de forma predeterminada.

Así que la diferencia en C++ es que sqrt() acepta ya sea un double, un float o una long double mientras sqrtf() sólo acepta un float.

Como dice la documentación, la única razón por la que hay dos versiones diferentes es porque C no admitía la sobrecarga, por lo que tenía que haber dos funciones. C++ permite la sobrecarga, por lo que en realidad hay tres versiones diferentes de sqrt() que toman argumentos de coma flotante de varios tamaños.

Así que en C++, ambos fragmentos de código hacen esencialmente lo mismo. En C, sin embargo, habría habido una conversión de float a double en la llamada sqrt().

+0

una pregunta si sqrt acepta un doble, entonces ¿por qué funciona si agrega el tipo de flotante delante del número entero ?, ¿no debería ser el doble? –

+0

"Entonces la diferencia es que sqrt() acepta un doble" - solo en C, en C++ está sobrecargado para aceptar cualquier tipo de FP. –

+0

@Matteo Italia: Correcto. Debería haberlo señalado. –

3

C no admitía la sobrecarga de funciones. Eso significa que tenía que haber una función diferente para cada tipo. De ahí un sqrt para double y sqrtf para float. Como double era el tipo "preferido" para los números de coma flotante en C, la versión "predeterminada" era la de double. Ambos son parte de la biblioteca estándar C, en math.h.

En C++, se debe utilizar el sqrt sobrecargado (definido en cmath, en el espacio de nombres std).

2

sqrtf es una herencia de C.

En C++ tenemos sobrecarga, y la función sqrt tiene diferentes sobrecargas para los tres tipos de punto flotante. En C, en cambio, no hay sobrecarga, por lo que las diversas versiones de la función de raíz cuadrada deben distinguirse con el nombre de la función; por lo tanto, tenemos sqrt (que en C solo funciona en double s) y sqrtf para float s.

+3

¡Nunca supe que esto era diferente en Canadá! –

+0

@Paul: eso es lo que sucede cuando escribes desde un teléfono con una autocorrección demasiado entusiasta. :) –

+0

Heh - estado allí ... ;-) –

3

En C++, la función sqrt está sobrecargado a tomar ya sea un double, un float o una long double como argumento. Cuando pasa un int, se pueden llamar a todos los y no hay forma de que el compilador elija uno sobre los demás, por lo que la llamada es ambigua. Si convierte explícitamente int a float, por supuesto, uno de los tres es una coincidencia exacta, que lo hace mejor que los otros dos, por lo que se llama.

La función sqrtf es de C; en C, no hay sobrecarga; sqrt es siempre sqrt(double), y sqrtf toma float. Como esta función no está sobrecargada, llamarla no puede generar ambigüedades.

+0

lo que significa que si tengo un código C++, no necesito tener sqrtf, ¿verdad? –