2011-09-15 1 views
12

Je veux prendre en compte le code. D'abord, il est:Différence entre sqrt et sqrtf

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

Il m'a donné cette erreur:

>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 j'ajoute type flottant entre parenthèses devant s, comme ceci:

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

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

je suis arrivé que je devinerait, 5. Et une autre variante est qu'au lieu de sqrt, si j'écris sqrtf:

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

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

J'ai aussi 5.

Quelle est la différence entre eux? Cela signifie-t-il que sqrtf est identique à sqrt pour le type float?

+0

Mais vous n'obtiendrez pas une erreur que vous compilez en g ++ (compilateur GNU) – vivek

Répondre

15

est ici a page on MSDN documentation for sqrt() and sqrtf(), qui explique la différence:

sqrt, sqrtf

Calcule la racine carrée.

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

Paramètres

x: non négatif Valeur à virgule flottante

Remarques

C++ permet une surcharge, afin que les utilisateurs peuvent appeler des surcharges de sqrt qui prennent flotter ou long double les types. Dans un programme C, sqrt toujours prend et retourne double.

Valeur de retour

Le sqrt fonction retourne la racine carrée de x. Si x est négatif, sqrt renvoie une valeur indéfinie, par défaut.

Ainsi, la différence de C++ est que sqrt() accepte soit un double, un float ou un long double alors que sqrtf() accepte seulement float. Comme le dit la documentation, la seule raison pour laquelle il existe deux versions différentes est que C ne supportait pas la surcharge, donc il devait y avoir deux fonctions. C++ permet la surcharge, il y a donc trois versions différentes de sqrt() prenant des arguments à virgule flottante de différentes tailles.

Donc, en C++, les deux extraits de code font essentiellement la même chose. Sur C, cependant, il y aurait eu une conversion de float à double dans l'appel sqrt().

+0

une question si sqrt accepte un double alors pourquoi ça marche si ajouter un type float devant un entier? Ne devrait-il pas être double? –

+0

"Donc la différence est que sqrt() accepte un double" - seulement en C, en C++ il est surchargé pour accepter tout type de FP. –

+0

@Matteo Italia: Correct. J'aurais dû le signaler. –

3

C ne prenait pas en charge la surcharge de fonction. Cela signifie qu'il devait y avoir une fonction différente pour chaque type. D'où sqrt pour double et sqrtf pour float. Puisque double était le type "préféré" pour les nombres à virgule flottante dans C, alors la version "par défaut" était celle pour double. Les deux font partie de la bibliothèque standard C, au math.h.

En C++, le sqrt surchargé (défini dans cmath, dans l'espace de noms std) doit être utilisé.

2

sqrtf est un héritage de C.

En C++, nous avons la surcharge et la fonction sqrt a différentes pour les trois surcharges types à virgule flottante. En C, au contraire, il n'y a pas de surcharge, donc les différentes versions de la fonction racine carrée doivent être distinguées avec le nom de la fonction; par conséquent nous avons sqrt (cela en C fonctionne seulement sur double s) et sqrtf pour float s.

+3

Je n'ai jamais su que c'était différent au Canada! –

+0

@Paul: c'est ce qui arrive quand vous écrivez à partir d'un téléphone avec une correction automatique trop zélée. :) –

+0

Heh - été là ... ;-) –

3

En C++, la fonction sqrt est surchargée pour prendre soit un double, un float ou un long double comme argument. Lorsque vous passez un int, tous les trois peuvent être appelés, et il est impossible pour le compilateur de choisir un sur les autres, de sorte que l'appel est ambigu. Si vous convertissez explicitement le int en float, bien sûr, l'un des trois est un match exact, qui le rend meilleur que les deux autres, donc il est appelé.

La fonction sqrtf provient de C; en C, il n'y a pas de surcharge; sqrt est toujours sqrt(double), et sqrtf prend un float. Puisque cette fonction n'est pas surchargée, l'appeler ne peut pas entraîner d'ambiguïté.

+0

ce qui signifie que si j'ai un code C++, je n'ai pas besoin d'avoir sqrtf, non? –