|
|
|
|
MCignaz hat sich da einen schönen Musterfall des Selbststudiums aufgerissen.
Step 1: Meine nächste Idee is sicher easy, ich weiß nur nich genau wie es geht.
Step 2: Oh.
Step 3: Grundlagen über [Gleitkommadarstellungen|Testmethodik] studieren
Step 4: Umsetzen. Go to Step 1.
|
|
|
|
|
|
|
| Zitat von csde_rats
Ohne schmutzige Tricks: gar nicht.
Floats haben eine Auflösung abhängig von der Größe des Wertes, entsprechend liefert
for(double x = DBL_MIN; x < DBL_MAX; x += DBL_MIN) {
...
nicht das erhoffte Ergebnis.
Und wie oben schon angedeutet: das geht rein zeitlich nicht. Ein float, gut, das geht. Double hat dann schon was um die 2**64 und long double um die 2**80 Werte.
| |
Hmhm, ich kann jetzt tatsächlich kein C++... wäre diese for-Schleife nicht falsch? Muss man da nicht bei -DBL_MAX anfangen, wie auch in Java?
|
|
|
|
|
|
|
Schon ja, aber das Detail ist egal, terminiert eh nicht.
|
|
|
|
|
|
|
Mit genügend Geduld und Speicher, vielleicht ja doch!
Ha, und dann stauen alle.
|
|
|
|
|
|
|
Selbst dann hat er eine Myriade Input/Output-Paare. Was macht er dann damit?
|
|
|
|
|
|
|
Ich weiß, was du meinst, aber bevor wir hier MCignaz vollends verwirren...
>>> import sys
>>> 1.0 == 1.0 + sys.float_info.min
True
... soll heißen: Wenn man Werte kleiner als die halbe Auflösung auf einen Float addiert (und die Auflösung hängt vom konkreten Wert ebendieses Floats ab!), dann passiert gar nix ; die Binärdarstellung bleibt gleich.
Illustration mittels Python, das Verhalten ist aber in C gleich.
|
|
|
|
|
|
|
| Zitat von Rufus
Selbst dann hat er eine Myriade Input/Output-Paare. Was macht er dann damit?
| |
Dynamic Quantum Clustering!
|
|
|
|
|
|
|
| Zitat von csde_rats
Wenn man Werte kleiner als die halbe Auflösung auf einen Float addiert (und die Auflösung hängt vom konkreten Wert ebendieses Floats ab!), dann passiert gar nix ; die Binärdarstellung bleibt gleich.
| |
Aus dir wäre ein feiner FIAE geworden.
|
|
|
|
|
|
|
Traxer weint gleich
Nochmal fix zur Verdeutlichung, double hat 1 bit Vorzeichen, 11 bit Exponent, 52 Bit Mantisse
1.0 heißt Exponent genau 0, denn 2**0 = 1
Mantisse ist genau 1, denn 1*2**0 = 1*1 = 1
Auflösung bei 1.0 ist also 2**-52
Und tatsächlich:
>>> 1.0 == 1.0 + (0.49*2**-52)
True
>>> 1.0 == 1.0 + (0.51*2**-52)
False
|
|
|
|
|
|
|
| Zitat von [smith]
Hmhm, ich kann jetzt tatsächlich kein C++... wäre diese for-Schleife nicht falsch? Muss man da nicht bei -DBL_MAX anfangen, wie auch in Java?
| |
Eine irreführend benannte Konstante. Das gehört in die Liste der Punkte, die an Java schlecht sind.
Spoiler - markieren, um zu lesen:
Eine Konstante namens MIN_VALUE sollte natürlich den kleinstmöglichen Wert enthalten, nicht den kleinstmöglichen positiven Wert.
|
|
|
|
|
|
|
Ja, aber das war nicht seine Frage.
Fakt 1: rats' Schleife müsste bei -DBL_MAX anfangen, ja.
Fakt 2: DBL_MIN ist scheiße benannt, ja.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Rufus am 14.09.2014 17:52]
|
|
|
|
|
|
Spoiler - markieren, um zu lesen:
Ist aber auch in C so.
FLT/DBL/LDBL_MIN : Minimum normalized positive floating-point number
Deine Interpretation ergibt imho nur Sinn bei Typen mit gleichmäßiger Auflösung, also heutzutage eigentlich nur integer Typen. Die Bennenung ist natürlich trotzdem blöd, sollte _SMALLEST oder so sein.
/e: Zwipo, Nur weil ich in der Manpage die Definition nachgeschaut und schön formatiert habe!
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 14.09.2014 17:53]
|
|
|
|
|
|
| Zitat von Rufus
Ja, aber das war nicht seine Frage.
| |
Ich wollte bloß mal wieder über Java herziehen. .NET macht's richtig.
|
|
|
|
|
|
|
Keine Sorge, ich programmiere lange genug beruflich mit Java, dass ich selber weiß wie grottenkacke das ist!
Aber man wird halt dafür bezahlt...
|
|
|
|
|
|
|
Danke fuer eure Antworten. Da lohnt sichs ja nochmal die alten Unterlagen zu dem Thema rauszusuchen. Hatte gehofft, dass es etwas einfacheres gibt.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von MCignaz am 14.09.2014 20:12]
|
|
|
|
|
C++
|
Hab gerade aus Versehen (a,b) anstatt (a+b) (a,b sind double) gecodet. Hat schön kompiliert, aber was passiert da? Im Debugger scheint keine Funktion aufgerufen zu werden.
|
|
|
|
|
|
|
|
|
|
|
Herzlichen Glückwunsch, du bist in der dunklen Seite von C/C++ angekommen.
|
|
|
|
|
|
|
pff... bei dem was ich schon gesehen habe, ist das eher ein Lichtstrahl
|
|
|
|
|
|
|
| Zitat von _Ac_
Hab gerade aus Versehen (a,b) anstatt (a+b) (a,b sind double) gecodet. Hat schön kompiliert, aber was passiert da? Im Debugger scheint keine Funktion aufgerufen zu werden.
| |
Ist einfach nur b.
@wuSel: Wenn ich in $random Sprache plus statt minus schreibe, kompiliert/läuft das auch einfach weiterhin o)
|
|
|
|
|
|
|
Solange man ihn nicht überlädt, ist er ganz ok.
***
| Zitat von _Ac_
pff... bei dem was ich schon gesehen habe, ist das eher ein Lichtstrahl
| | Jetzt bin ich neugierig!
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von cms am 15.09.2014 12:03]
|
|
|
|
|
|
Ja, darum ging es mir nicht. Aber in modernen Sprachen passiert sowas hier nicht:
i = (a, b); // stores b into i
Ich meinte den Operator ansich.
|
|
|
|
|
|
|
| Zitat von csde_rats
| Zitat von _Ac_
Hab gerade aus Versehen (a,b) anstatt (a+b) (a,b sind double) gecodet. Hat schön kompiliert, aber was passiert da? Im Debugger scheint keine Funktion aufgerufen zu werden.
| |
Ist einfach nur b.
@wuSel: Wenn ich in $random Sprache plus statt minus schreibe, kompiliert/läuft das auch einfach weiterhin o)
| |
Ja, ist mir jetzt schon klar; war mir einfach grad nicht bewusst, dass da der Kommaoperator mitmischt
Danke jedenfalls.
|
|
|
|
|
|
|
| Zitat von wuSel
Ja, darum ging es mir nicht. Aber in modernen Sprachen passiert sowas hier nicht:
i = (a, b); // stores b into i
Ich meinte den Operator ansich.
| | Viel interessanter ist doch, dass bei
i = a, b;
i == a ist.
|
|
|
|
|
|
|
| Zitat von cms
Solange man ihn nicht überlädt, ist er ganz ok.
***
| Zitat von _Ac_
pff... bei dem was ich schon gesehen habe, ist das eher ein Lichtstrahl
| | Jetzt bin ich neugierig!
| |
Ich sag nur Boost MPL und Boost Graph library
|
|
|
|
|
|
|
Das ist halt so ein bisschen eine Art Mehrzweck Einzweckoperator um mehrere Ops in Schleifenköpfen zu machen. Deswegen hat der auch die niedrigste Prio...
| Zitat von cms
| Zitat von wuSel
Ja, darum ging es mir nicht. Aber in modernen Sprachen passiert sowas hier nicht:
i = (a, b); // stores b into i
Ich meinte den Operator ansich.
| | Viel interessanter ist doch, dass bei
i = a, b;
i == a ist.
| |
while(i++, current = current->next) {
...
/e: so rum, es sei denn man möchte Abbruch manuell prüfen oder hat ein anderes Kriterium.
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von csde_rats am 15.09.2014 12:13]
|
|
|
|
|
|
|
|
|
|
| Zitat von csde_rats
Das ist halt so ein bisschen eine Art Mehrzweck Einzweckoperator um mehrere Ops in Schleifenköpfen zu machen.
| |
Und damit ist es ja eigentlich ziemlich cool. Von wegen dunkle Seite, das geht echt schlimmer.
|
|
|
|
|
|
|
Kennt sich wer mit JSoup aus?
Versuch gerade ein Stück HTML auseiander zu nehmen.
Leider ist das HTML nicht besonders schön, d.h. verschachtelte Tabellen ohne eindeutige Klassen bzw. IDs.
Beispielconstrukt:
|
Code: |
<table>
<tbody>
<tr>
<td>
<table>
<tbody>
<tr>
<td><b class="c1">Text</b><br />Text2
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
|
|
Wie komm ich an den Text nach <br />?
Oder wie komme ich an das td? Quasi das Parent von <b class="c1">.
|
Code: |
Element bParent = doc.select("b.c1").parent(); |
|
funktioniert nicht.
Vielleicht versteh ich JSoup auch noch zu wenig ..
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von krak0s am 15.09.2014 17:29]
|
|
|
|
|
|
grmpf grmpf grmpf, zweite harmonische Erzeugung erreicht einfach zu wenig Ausgangsleistung... frustrierend.
|
|
|
|
|
|
Thema: pOT-lnformatik, Mathematik, Physik XVII ( Code drunk, debug sober! ) |