7 Stimmen

sqrt(int_value + 0.0) -- Hat das einen Sinn?

Während ich einige Hausaufgaben in meinem sehr seltsamen C++-Buch machte, die ich schon mal wegwerfen sollte hatte ein sehr merkwürdiges Codesegment. Ich weiß, dass Hausaufgaben immer zusätzliche "Geheimnisse" enthalten, die einen verwirren sollen, wie z. B. das Einrücken von 2 Zeilen nach einer for-Schleife mit einer Anweisung. Aber das hier verwirrt mich, weil es einen echten Zweck zu erfüllen scheint.

Im Grunde ist es so:

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

Ich interessiere mich besonders für diesen Teil:

sqrt(counter+0.0)

Gibt es einen Grund für die +0.0 ? Ist das die Poormans-Methode, um einen statischen Wurf auf ein Double zu machen? Wird dadurch eine Compilerwarnung auf einem Compiler vermieden, den ich nicht verwende? Das gesamte Programm gab genau das Gleiche aus und wurde ohne Warnungen mit g++ kompiliert, wenn ich das +0.0 Teil. Vielleicht verwende ich keinen ausreichend seltsamen Compiler?

Bearbeiten:

Außerdem bricht gcc nur Standard und nicht einen Fehler für zweideutige Verweis seit sqrt 3 verschiedene Arten von Parametern annehmen kann?

[earlz@EarlzBeta-~/projects/homework1] $ cat calc.cpp
#include <cmath>

int main(){
  int counter=0;
  sqrt(counter);
}
[earlz@EarlzBeta-~/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()
[earlz@EarlzBeta-~/projects/homework1] $

Hier ist auch der relevante Teil meiner Systembibliotheken cmath Ich bin nicht sonderlich scharf auf Vorlagen, daher bin ich mir nicht sicher, was sie bewirken.

  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);

13voto

James McNellis Punkte 337231

Ist das die Poormans-Methode, um einen statischen Wurf auf ein Double zu machen?

Oui.

Sie können nicht anrufen sqrt mit einer int als seinen Parameter, weil sqrt nimmt eine float , double , oder long double . Sie müssen die int zu einem dieser Typen, sonst ist der Aufruf mehrdeutig.

0voto

Gaurav Kushwaha Punkte 93

Der Grund für den Ausdruck "Zähler + 0,0" ist, dass es sich explizit um eine reelle Zahl handelt. Wenn wir nicht 0,0 hinzufügen, nimmt der Compiler eine implizite Umwandlung vor.

0voto

flopex Punkte 414

Es ist nur eine weitere Möglichkeit, einen Doppelgänger zu werfen. Das liegt daran, dass sqrt keine Ints akzeptiert. Da ein double höher ist, wird der int in den 0.0 verschmolzen. Das gleiche gilt für die Konvertierung von (int,double,float) nach string.

double n = 0;

string m = ""+n;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X