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