The Daily WTF
-
Doch noch was auf der HD gefunden: kein Grösser/Kleiner, kein Epsilon, und doch funktioniert die Wurzelberechnung

float value = 3; float top = value; float bottom = 0; float middle = bottom + (top - bottom)/2; while( top != middle && bottom != middle ){ if( middle * middle > value ) top = middle; else bottom = middle; middle = bottom + (top - bottom)/2; } System.out.printf( "sqrt %1$f = %2$f\n%2$f*%2$f = %3$f", value, middle, middle*middle );Wie das in irgendwelchen zutode optimierten c-libs aussieht, kann ich nicht sagen. Diese Variante mit der Maschinengenauigkeit umzugehen, ist jedenfalls ziemlich robust.
-
wazu ist den das gut?
float value = 3; float top = value; float bottom = 0; float middle = bottom + (top - bottom)/2;wieso nicht gleich
float middle = value / 2;
-
lol, das ist schon echt auch WTF-verdächtig.

-
DEvent schrieb:
wazu ist den das gut?
float value = 3; float top = value; float bottom = 0; float middle = bottom + (top - bottom)/2;Ein compiler sollte das weg-optimieren. Aber zur Verstaendnis und einfacheren Lesbarkeit schadet es nicht. Im Gegenteil.
Und wie du unten siehst, werden die Variablen noch genutzt, ohne kommst du also eh nicht aus.wieso nicht gleich
float middle = value / 2;Wieso nicht gleich float middle = 3 / 2? value is auch konstant. Wenn du schon bei bist, koenntest du natuerlich gleich das Ergebnis des ganzen Algorithmus ausrechnen.

--
Andreas
-
Andreas Kohn schrieb:
wieso nicht gleich
float middle = value / 2;Wieso nicht gleich float middle = 3 / 2?
Weil da nicht 1.5 rauskommt!
-
Walli schrieb:
Weil da nicht 1.5 rauskommt!
aber das programm funktioniert mit 2/3 auch!
-
int isTrueReturnsTrueIfTheArgumentIsTrueAndFalseIfItIsNotTrue(int t) { // }
-
volkard schrieb:
dem muß ich nicht zustimmen.
Das mit epsilon war ja auch nicht generalisiert zu verstehen. Wenn du für deine Zwecke sowas nicht brauchst, musst du es auch nicht benutzen.
volkard schrieb:
aber ungeachtet dessen, kann ich sofort abbrechen, wenn neuerwert-(neuerwert-alterwert)==neuerwert.
Darf ich trotzdem nochmal fragen, warum du das schreibst und nicht gleich 'alterwert == neuerwert'?
-
if(ahp>=0) if(ahp>=mhp*0.1) if(ahp>=mhp*0.2) if(ahp>=mhp*0.3) if(ahp>=mhp*0.4) if(ahp>=mhp*0.5) if(ahp>=mhp*0.6) if(ahp>=mhp*0.7) if(ahp>=mhp*0.8) if(ahp>=mhp*0.9) if(ahp==mhp) cout<<" [||||||||||] "; else cout<<" [||||||||||] "; else cout<<" [||||||||| ] "; else cout<<" [|||||||| ] "; else cout<<" [||||||| ] "; else cout<<" [|||||| ] "; else cout<<" [||||| ] "; else cout<<" [|||| ] "; else cout<<" [||| ] "; else cout<<" [|| ] "; else cout<<" [ ] "; if(asp>=0) if(asp>=msp*0.1) if(asp>=msp*0.2) if(asp>=msp*0.3) if(asp>=msp*0.4) if(asp>=msp*0.5) if(asp>=msp*0.6) if(asp>=msp*0.7) if(asp>=msp*0.8) if(asp>=msp*0.9) if(asp==msp) cout<<"[||||||||||] "; else cout<<"[||||||||||] "; else cout<<"[||||||||| ] "; else cout<<"[|||||||| ] "; else cout<<"[||||||| ] "; else cout<<"[|||||| ] "; else cout<<"[||||| ] "; else cout<<"[|||| ] "; else cout<<"[||| ] "; else cout<<"[|| ] "; else cout<<"[ ] "; if(axp>=0) if(axp>=mxp*0.1) if(axp>=mxp*0.2) if(axp>=mxp*0.3) if(axp>=mxp*0.4) if(axp>=mxp*0.5) if(axp>=mxp*0.6) if(axp>=mxp*0.7) if(axp>=mxp*0.8) if(axp>=mxp*0.9) if(axp==mxp) cout<<"[||||||||||]"<<endl<<endl; else cout<<"[||||||||||]"<<endl<<endl; else cout<<"[||||||||| ]"<<endl<<endl; else cout<<"[|||||||| ]"<<endl<<endl; else cout<<"[||||||| ]"<<endl<<endl; else cout<<"[|||||| ]"<<endl<<endl; else cout<<"[||||| ]"<<endl<<endl; else cout<<"[|||| ]"<<endl<<endl; else cout<<"[||| ]"<<endl<<endl; else cout<<"[|| ]"<<endl<<endl; else cout<<"[ ]"<<endl<<endl; break;
-
groovemaster schrieb:
Darf ich trotzdem nochmal fragen, warum du das schreibst und nicht gleich 'alterwert == neuerwert'?
Weil die Werte möglicherweie verschieden sind. Dann schlägt der Vergleich nicht an. Ist aber der eine sehr klein im Vergleich zum anderen kann es durch Rundung passieren, daß das Abziehen eben garnichts mehr ändert.
-
Jester schrieb:
Weil die Werte möglicherweie verschieden sind. Dann schlägt der Vergleich nicht an.
Das wäre aber bei der Kurzform auch so.
Jester schrieb:
Ist aber der eine sehr klein im Vergleich zum anderen kann es durch Rundung passieren, daß das Abziehen eben garnichts mehr ändert.
Und du erhälst dann '0 == neuerwert'? Aber was soll das bringen?
So wie ich Volkard verstehe, benutzt er lieber 'neuerwert-(neuerwert-alterwert)==neuerwert' als den Vergleich mit epsilon. Naja, ist wohl Geschmackssache.
-
Falls den einer nicht gesehen hat auf dailywtf:
switch ($_GET['action']) { default: if ($_GET['action'] == 'delete') { $editid = (int) $_GET['delete']; } elseif ($_GET['action'] == 'edit') { $editid = (int) $_GET['edit']; } /* ED: Snip */ elseif ($_GET['action'] == 'save') { $editid == (int) $_GET['save']; } else { $editid = (int) $_GET['id']; } break; }
-
genial, werd ich auch gleich mal so machen

-
Fuck!
Ich bin grad Code am Ändern, nen auto_ptr durch einen anderen intelligenten Pointer ersetzen.
Nun compiliert aber gerade dieser eine Funktionsaufruf nicht. Ich schaue also nach und sehe,
dass ein anderer Programmierer das hier hingeschrieben hat:void foo( auto_ptr<X>* ptr);WTF!!

Nachtrag:
In der Funktion steht dann als einzige Verwendung das hier:
ptr->get()->.....
-
Ist ein auto_ptr per Referenz okay?
-
& schrieb:
Ist ein auto_ptr per Referenz okay?
Kommt darauf an was du bezweckst. Wenn du den Besitz nicht an die Funktion übergeben willst dann mußt du sogar eine Reference nehmen (oder theoretisch macht es auch der Zeiger wie oben gezeigt auch) wenn du den Besitz aber übergeben willst dann musst du einen Wert übergeben.
Hängt also vom Gebrauch ab.
-
Welchen Sinn macht denn solch eine Funktion?

Ich übergebe den Besitz "vielleicht"?
Wenn nur der nackte Pointer gebraucht wird, warum dann die Schnittstelle vom auto_ptr abhängig machen?
Vor allem, wenn das hier völlig gültiger Code ist:void foo( auto_ptr<X>* ptr) { auto_ptr<X> harry = *ptr; }Entweder ich übergebe den Besitz oder nicht - nix dazwischen. Nix auto_ptr per Referenz oder Pointer -.-'
-
naja, wenn der programmierer selber hauptsächlich mit auto_ptr arbeitet(weil er von shared_ptr nix gehört hat), und in der funktion selber den zeiger nur benutzen will, ohne dann immer ein lästiges bar.get() zu schreiben, dann versteh ich das.
-
Wenn man eigentlich boost::scoped_ptr meint, dann aber trotzdem std::auto_ptr nimmt macht die Übergabe per Referenz z.B. Sinn.
-
enum Bool { True, False, FileNotFound };