tag:forum.selfhtml.org,2005:/self Brett vorm Kopf. Finde den Fehler nicht. – SELFHTML-Forum 2020-07-03T07:12:36Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772746#m1772746 Joachim 2020-06-30T11:46:00Z 2020-06-30T11:46:42Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo,</p> <p>wer nimmt mal gerade mein Brett vor dem Kopf weg? Warum ergibt die if-Bedingung <code>true</code>?</p> <pre><code class="block language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c. <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.01 b: 146.18 c: 188.19 </code></pre> <p>Ich habs auch mal versucht, die 3 Werte nochmal über <code>settype</code> explizit auf Floatwerte zu casten, aber das ändert nichts.</p> <p>Joachim</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772750#m1772750 Operator https://www.php.net/manual/de/language.operators.precedence.php 2020-06-30T12:00:57Z 2020-06-30T12:00:57Z Brett vorm Kopf. Finde den Fehler nicht. <p>Auch Hallo,</p> <blockquote> <p>wer nimmt mal gerade mein Brett vor dem Kopf weg? Warum ergibt die if-Bedingung <code>true</code>?</p> <pre><code class="block language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c. <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.01 b: 146.18 c: 188.19 </code></pre> <p>Ich habs auch mal versucht, die 3 Werte nochmal über <code>settype</code> explizit auf Floatwerte zu casten, aber das ändert nichts.</p> </blockquote> <p>Vielleicht findet sich die Lösung <a href="https://www.php.net/manual/de/language.operators.precedence.php" rel="nofollow noopener noreferrer">in der Operatorrangfolge</a>?</p> <p>Manchmal helfen auch ein paar Klammern.</p> <p>Stay TRUE<br> der Operator</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772751#m1772751 Erik K. 2020-06-30T12:01:02Z 2020-06-30T12:01:02Z Brett vorm Kopf. Finde den Fehler nicht. <p>Also bei mir mit php7.3 ergibt der Code keine Ausgabe.</p> <p>Was sagt var_dump zu den 3 Variablen? Welche php-Version hast du?</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772753#m1772753 Der Martin 2020-06-30T12:07:37Z 2020-06-30T12:07:37Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hi,</p> <blockquote> <p>wer nimmt mal gerade mein Brett vor dem Kopf weg?<br> Warum ergibt die if-Bedingung <code>true</code>?</p> <pre><code class="block language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c. <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.01 b: 146.18 c: 188.19 </code></pre> </blockquote> <p>naja, ist ja auch <strong>fast</strong> korrekt.<br> Ich tippe mal auf einen Klassiker: Rundungsfehler bei der Addition von float-Werten.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772768#m1772768 Rolf B 2020-06-30T14:41:40Z 2020-06-30T14:45:09Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Joachim,</p> <p>man kann das Problem noch einfacher darstellen. <=> ist der Spaceship Operator, der -1, 0 oder 1 ausgibt, je nachdem, ob der linke Operand kleiner als, gleich wie oder größer als der rechte Operand ist.</p> <pre><code class="block language-php"><span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token number">42.01</span> <span class="token operator">+</span> <span class="token number">146.17</span> <span class="token operator"><=></span> <span class="token number">188.18</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token number">42.01</span> <span class="token operator">+</span> <span class="token number">146.18</span> <span class="token operator"><=></span> <span class="token number">188.19</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token number">42.02</span> <span class="token operator">+</span> <span class="token number">146.18</span> <span class="token operator"><=></span> <span class="token number">188.20</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> </code></pre> <p>Ergibt</p> <pre><code class="block">-1 0 1 </code></pre> <p>Grund: Der Datentyp float kann Integerzahlen im Bereich der Mantissenlänge jederzeit korrekt darstellen. Sobald Nachkommazahlen ins Spiel kommen, wird es schwierig, weil [IEEE 754] ein binäres Format ist. Du kannst bspw. 1/7 nicht als endliche Dezimalzahl darstellen. Und Du kannst 1/100 nicht als endliche Binärzahl darstellen.</p> <p>Dass der mittlere Vergleich 0 ergibt, ist reiner Zufall.</p> <p><a href="https://wiki.selfhtml.org/wiki/Programmiertechnik/Rechnerarithmetik" rel="nofollow noopener noreferrer">Janosch war dazu im Wiki sehr fleißig</a></p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772761#m1772761 dedlfix 2020-06-30T13:24:32Z 2020-06-30T13:24:32Z Brett vorm Kopf. Finde den Fehler nicht. <p>Tach!</p> <blockquote> <p>Vielleicht findet sich die Lösung <a href="https://www.php.net/manual/de/language.operators.precedence.php" rel="nofollow noopener noreferrer">in der Operatorrangfolge</a>?</p> </blockquote> <p>Nein, <code>+</code> hat eine höhere Priorität als <code>></code>, also ist das genau das gewünschte.</p> <blockquote> <p>Manchmal helfen auch ein paar Klammern.</p> </blockquote> <p>In dem Fall nicht.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772795#m1772795 Graf Bit 2020-07-01T06:10:23Z 2020-07-01T06:10:23Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo,</p> <p>könnte man nicht mit Hilfe von <a href="https://www.php.net/manual/en/function.decbin" rel="nofollow noopener noreferrer"><code>decbin()</code></a> nachgucken, was PHP da im Hintergrund macht?</p> <p>bis später<br> Graf Bit</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772756#m1772756 Joachim 2020-06-30T12:25:15Z 2020-06-30T12:25:15Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hi Martin,</p> <blockquote> <p>naja, ist ja auch <strong>fast</strong> korrekt.<br> Ich tippe mal auf einen Klassiker: Rundungsfehler bei der Addition von float-Werten.</p> </blockquote> <p>Hätte ich auch vermutet. Aber lass mal diesen Code laufen:</p> <pre><code class="block language-php"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token number">42.02</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token number">146.18</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token number">188.20</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<br>equal"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<br>equal"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Er ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.02 b: 146.18 c: 188.20 equal </code></pre> <p>Ist schon irre. </p> <p>Joachim</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772757#m1772757 Der Martin 2020-06-30T13:02:07Z 2020-06-30T13:02:07Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Joachim,</p> <blockquote> <pre><code class="block language-php"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token number">42.02</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token number">146.18</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token number">188.20</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<br>equal"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<br>equal"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Er ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.02 b: 146.18 c: 188.20 equal </code></pre> </blockquote> <p>da wird sowohl der if- als auch der else-Zweig bearbeitet??<br> Das <em>kann</em> völlig unabhängig von der Bedingung eigentlich nicht sein; da muss noch ein anderer Fehler drinstecken. Irgendein überzähliges Semikolon oder falsch gesetzte Klammern - etwas in der Art.</p> <p>Gemein wäre etwa sowas:</p> <pre><code class="block language-php"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"false ist doch true!"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Beachte das Semikolon hinter der if-Klammer: Es schließt die if-Anweisung ohne Anweisungsblock ab, der nachfolgende Block in geschweiften Klammern gehört dann nicht mehr zur if-Anweisung. Solche Fehler sind schwer zu finden, weil sie eben keine Syntaxfehler sind.</p> <blockquote> <p>Ist schon irre. </p> </blockquote> <p>Vielleicht ist die Erklärung ganz simpel.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772800#m1772800 encoder 2020-07-01T08:46:52Z 2020-07-01T08:46:52Z Brett vorm Kopf. Finde den Fehler nicht. <p>Ganz so irre ist das nicht. Es ist doch der selbe Fall wie im ersten Beispiel.</p> <p>Interessehalber habe ich nach "online float representation" gesucht und neben ein paar anderen Ergebnissen das hier gefunden <a href="http://weitz.de/ieee/" rel="nofollow noopener noreferrer">http://weitz.de/ieee/</a></p> <p>Damit kannst du sehen wie deine Zahlen binär dargestellt werden und kannst sie addieren.</p> <p>Dabei kommt heraus dass die Summe deiner Zahlen 188.20000000000002 ist.<br> Die einzelne Zahl 188.2 lässt sich dagegen ohne Rundungsfehler darstellen, also ist die Summe tatsächlich größer als 188.2.</p> <p>Das hier war mein erster Fund <a href="https://www.h-schmidt.net/FloatConverter/IEEE754de.html" rel="nofollow noopener noreferrer">https://www.h-schmidt.net/FloatConverter/IEEE754de.html</a>.<br> Auch nett, aber nur in 32 Bit Darstellung und ohne Rechenmöglichkeit.</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772758#m1772758 Joachim 2020-06-30T13:08:16Z 2020-06-30T13:11:22Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Martin,</p> <blockquote> <p>da wird sowohl der if- als auch der else-Zweig bearbeitet??<br> Das <em>kann</em> völlig unabhängig von der Bedingung eigentlich nicht sein;</p> </blockquote> <p>Es sind 2 if-else-Blöcke </p> <p>Daher weht der Wind.</p> <p>Was mich wundert, ist aber, dass ich dachte, wenn php Strings zum addieren vorfindet, dass es selber castet. Wenn möglich in INT oder wenn mit nachkomma, dann in Float.</p> <p>Das passiert auch, aber das Ergebnis stimmt trotzdem nicht.</p> <p>Joachim</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772763#m1772763 Joachim 2020-06-30T13:36:27Z 2020-06-30T13:36:27Z Brett vorm Kopf. Finde den Fehler nicht. <blockquote> <p>Gemein wäre etwa sowas:</p> <pre><code class="block language-php"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"false ist doch true!"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> </blockquote> <p>Oder sowas:</p> <pre><code class="block language-php"><span class="token variable">$var</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"false"</span><span class="token punctuation">;</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$var</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bool'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$var</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span> </code></pre> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772759#m1772759 Joachim 2020-06-30T13:19:51Z 2020-06-30T13:19:51Z Brett vorm Kopf. Finde den Fehler nicht. Oder verstehe settype nicht. :-/ <p>Wer kann mir erklären, was hier php genau macht? Wie kommt es zu dieser Ausgabe?</p> <pre><code class="block language-php"><span class="token comment">// Werte</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token number">42.02</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token number">146.18</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token number">188.20</span><span class="token punctuation">;</span> <span class="token comment">// Addition von Strings</span> <span class="token variable">$d1</span> <span class="token operator">=</span> <span class="token variable">$a</span><span class="token operator">+</span><span class="token variable">$b</span><span class="token punctuation">;</span> <span class="token comment">// Vergleich der Werte</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"1. Durchlauf: <br>Not equal<br>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$d1</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"(Variable d)<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"(Variable c)"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 2. Durchlauf mit gecasteten Werten</span> <span class="token comment">//------------------------------------------</span> <span class="token comment">// Cast in Float</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Adition von Float-Werten</span> <span class="token variable">$d2</span> <span class="token operator">=</span> <span class="token variable">$a</span><span class="token operator">+</span><span class="token variable">$b</span><span class="token punctuation">;</span> <span class="token comment">// Vergleich der Werte</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// nix</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"<br>-----------------------------<br>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"2. Durchlauf: <br>equal<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$d2</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"(Variable d)<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"(Variable c)"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Ausgabe:</p> <pre><code class="block">1. Durchlauf: Not equal float(188.2) (Variable d) float(188.2) (Variable c) ----------------------------- 2. Durchlauf: equal int(2) (Variable d) bool(true) (Variable c) </code></pre> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772760#m1772760 dedlfix 2020-06-30T13:22:16Z 2020-06-30T13:26:08Z Brett vorm Kopf. Finde den Fehler nicht. Oder verstehe settype nicht. :-/ <p>Tach!</p> <blockquote> <pre><code class="block language-php"><span class="token comment">// Cast in Float</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Zitat Handbuch: "Returns TRUE on success or FALSE on failure."</p> <p>Du castest erst den Typ zu float und überschreibst durch die Zuweisung die Variablen mit true.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772762#m1772762 Joachim 2020-06-30T13:31:07Z 2020-06-30T13:31:07Z Brett vorm Kopf. Finde den Fehler nicht. Oder verstehe settype nicht. :-/ <p>Hallo dedlfix,</p> <blockquote> <p>Du castest erst den Typ zu float und überschreibst durch die Zuweisung die Variablen mit true.</p> </blockquote> <p>Einverstanden. Hatte mir doch gedacht, dass ich bei <code>settype</code> Nachhilfe brauche </p> <p>Trotzdem erklärt es noch nicht, warum php den cast nicht selbstständig hin bekommt, denn php versucht es ja offensichtlich:</p> <pre><code class="block">1. Durchlauf: Not equal float(188.2) (Variable d) float(188.2) (Variable c) </code></pre> <p>Hast Du auch hierfür eine Lösung?</p> <p>Joachim</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772769#m1772769 Rolf B 2020-06-30T14:48:36Z 2020-06-30T14:48:36Z Brett vorm Kopf. Finde den Fehler nicht. Oder verstehe settype nicht. :-/ <p>Hallo Joachim,</p> <p>PHP muss gar nicht casten.</p> <pre><code class="block language-php"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token number">42.01</span><span class="token punctuation">;</span> </code></pre> <p>erzeugt bereits eine float-Variable, so dass settype($a, "float") wirkungslos ist.</p> <p>Zur Fehlerursache siehe meinen anderen Post.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772766#m1772766 Der Martin 2020-06-30T13:58:12Z 2020-06-30T13:58:12Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo,</p> <blockquote> <pre><code class="block language-php"><span class="token variable">$var</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"false"</span><span class="token punctuation">;</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$var</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bool'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$var</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span> </code></pre> </blockquote> <p>das ist in der Tat "tricky", aber nachvollziehbar: Ein String muss leer sein oder einen Null-Wert repräsentieren, um als boolsches <em>false</em> zu gelten.</p> <p>Ähnliche Fehler im Ansatz sieht man übrigens oft bei PHP-Laien, die den Unterschied zwischen Zahlenwerten und Strings noch nicht verstanden haben. Die notieren dann gern auch numerische Werte in Anführungszeichen, also als Strings. Meistens klappt das wegen der automatischen Typumwandlung, aber manchmal fällt man damit eben auf die Klappe.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772767#m1772767 Joachim 2020-06-30T14:15:29Z 2020-06-30T14:15:29Z Brett vorm Kopf. Finde den Fehler nicht. <blockquote> <p>Ähnliche Fehler im Ansatz sieht man übrigens oft bei PHP-Laien, die den Unterschied zwischen Zahlenwerten und Strings noch nicht verstanden haben. Die notieren dann gern auch numerische Werte in Anführungszeichen, also als Strings. Meistens klappt das wegen der automatischen Typumwandlung, aber manchmal fällt man damit eben auf die Klappe.</p> </blockquote> <p>Oder ein Integerüberlauf z.b in java wird auch immer wieder gerne genommen </p> <p>Oder auch sowas:</p> <pre><code class="block"> char b = 65; char c = 'A' + 1; java.lang.System.out.println( b ); // A java.lang.System.out.println( c ); // B </code></pre> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772775#m1772775 Der Martin 2020-06-30T15:25:04Z 2020-06-30T15:25:04Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Rolf,</p> <blockquote> <p><a href="https://wiki.selfhtml.org/wiki/Programmiertechnik/Rechnerarithmetik" rel="nofollow noopener noreferrer">Janosch war dazu im Wiki sehr fleißig</a></p> </blockquote> <p>genau den Beitrag wollte ich heute schon verlinken, habe aber nach etwa 10min erfolgloser Suche aufgegeben.</p> <p>Fazit: Der Beitrag ist gut, aber nicht prominent verlinkt, und die Wiki-Suche reißt's in dem Fall auch nicht raus.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772786#m1772786 Joachim 2020-06-30T18:59:51Z 2020-06-30T18:59:51Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Rolf,</p> <blockquote> <p>Grund: Der Datentyp float kann Integerzahlen im Bereich der Mantissenlänge jederzeit korrekt darstellen. Sobald Nachkommazahlen ins Spiel kommen, wird es schwierig, weil [IEEE 754] ein binäres Format ist. Du kannst bspw. 1/7 nicht als endliche Dezimalzahl darstellen. Und Du kannst 1/100 nicht als endliche Binärzahl darstellen.</p> <p>Dass der mittlere Vergleich 0 ergibt, ist reiner Zufall.</p> </blockquote> <p>Irre Aber verständlich, wenn mans weiß. Danke für die Aufklärung. Trotzdem bleibt für mich die Frage, wie ich einen <=> Vergleich denn dann zweifelsfrei anstellen soll. Wirklich sehr interessantes Thema, auf das ich da gestoßen bin. Wie händelt man das? Über eine Art "Fuzzy-Logic"? Oder gibt es einen anderen "Trick"?</p> <p>Joachim</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772777#m1772777 Rolf B 2020-06-30T15:35:11Z 2020-06-30T15:35:11Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Martin,</p> <p>suche nach IEEE oder Fließkomma.</p> <p><a href="https://wiki.selfhtml.org/index.php?search=flie%C3%9Fkomma&title=Spezial%3ASuche&go=Seite" rel="nofollow noopener noreferrer">https://wiki.selfhtml.org/index.php?search=fließkomma&title=Spezial%3ASuche&go=Seite</a></p> <p>Im Programmiertechnik-Portal ist sie auch verlinkt, aber das muss man wissen. Ich habe mal in den PHP Tutorials einen Link hinzugefügt. Jetzt muss nur noch jemand die PHP Startseite verlinken :D</p> <p>Ob man auch über's Glossar sinnvoll was machen kann?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772778#m1772778 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2020-06-30T15:45:59Z 2020-06-30T15:45:59Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Der Martin,</p> <p>wenn du deine Suchbegriffe mitteilst, könnte man entsprechende Weiterleitungen einrichten.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772780#m1772780 Der Martin 2020-06-30T16:04:20Z 2020-06-30T16:04:20Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Rolf,</p> <blockquote> <p>suche nach IEEE oder Fließkomma.</p> <p><a href="https://wiki.selfhtml.org/index.php?search=flie%C3%9Fkomma&title=Spezial%3ASuche&go=Seite" rel="nofollow noopener noreferrer">https://wiki.selfhtml.org/index.php?search=fließkomma&title=Spezial%3ASuche&go=Seite</a></p> </blockquote> <p>ich hatte als erste spontane Eingebung nach <strong>float</strong> gesucht und den Datentyp gemeint, der einzige Suchtreffer führte aber zur CSS-Eigenschaft <strong>float</strong>. Dann nach <strong>Rundungsfehler</strong>, brachte aber auch nichts Sinnvolles. Ich weiß nicht mehr, welche Suchbegriffe ich sonst noch probiert habe.</p> <blockquote> <p>Im Programmiertechnik-Portal ist sie auch verlinkt, aber das muss man wissen.</p> </blockquote> <p>Ja, ergibt Sinn. Jedenfalls nicht spezifisch PHP oder Javascript; das Problem kann einen in sehr vielen Programmiersprachen treffen. Und nicht nur da, sogar in Excel.</p> <blockquote> <p>Ob man auch über's Glossar sinnvoll was machen kann?</p> </blockquote> <p>Bestimmt. </p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772783#m1772783 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2020-06-30T17:35:01Z 2020-06-30T17:35:01Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Rolf B,</p> <blockquote> <p>Ob man auch über's Glossar sinnvoll was machen kann?</p> </blockquote> <p><a href="https://wiki.selfhtml.org/wiki/Runden" rel="nofollow noopener noreferrer">https://wiki.selfhtml.org/wiki/Runden</a></p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772781#m1772781 Rolf B 2020-06-30T16:18:59Z 2020-06-30T16:18:59Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Matthias,</p> <p>done.</p> <p>CSS/float: Links auf PHP/float und JavaScript/Number eingefügt</p> <p>Bei PHP/float und Number Links zur Rechnerarithmetik eingefügt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772782#m1772782 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2020-06-30T17:17:46Z 2020-06-30T17:17:46Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Der Martin,</p> <blockquote> <blockquote> <p><a href="https://wiki.selfhtml.org/index.php?search=flie%C3%9Fkomma&title=Spezial%3ASuche&go=Seite" rel="nofollow noopener noreferrer">https://wiki.selfhtml.org/index.php?search=fließkomma&title=Spezial%3ASuche&go=Seite</a></p> </blockquote> <p>ich hatte als erste spontane Eingebung nach <strong>float</strong> gesucht und den Datentyp gemeint, der einzige Suchtreffer führte aber zur CSS-Eigenschaft <strong>float</strong>. Dann nach <strong>Rundungsfehler</strong>, brachte aber auch nichts Sinnvolles. Ich weiß nicht mehr, welche Suchbegriffe ich sonst noch probiert habe.</p> </blockquote> <p>auf der float-Seite gibt es nun dank <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a> einen prominenten Link auf die Seite Programmiertechnik/Rechnerarithmetik, die Seite Rundungsfehler leitet seit 2018 ebenfalls auf diese Seite. Zusätzlich habe ich noch eine Weiterleitung von Rechnerarithmetik auf die entsprechende Seite erstellt.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772787#m1772787 Joachim 2020-06-30T19:07:43Z 2020-06-30T19:07:43Z Brett vorm Kopf. Finde den Fehler nicht. <p>Immerhin ergibt auch</p> <pre><code class="block">echo (round(42.01,2) + round(146.17,2) <=> round(188.18,2)) </code></pre> <pre><code class="block">-1 </code></pre> <p> </p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772788#m1772788 Der Martin 2020-06-30T19:15:35Z 2020-06-30T19:15:35Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Joachim,</p> <blockquote> <p>Trotzdem bleibt für mich die Frage, wie ich einen <=> Vergleich denn dann zweifelsfrei anstellen soll.</p> </blockquote> <p>ein Vergleich auf größer oder kleiner ist normalerweise unkritisch - außer wenn man weiß, dass der zu vergleichende Wert <em>sehr</em> dicht am Limit liegen kann und diese geringen Unterschiede wirklich relevant sind.</p> <p>Die übliche Strategie ist dann: Man legt eine maximal akzeptable Fehlerschwelle $error fest (z.B. $error=1E-6) und prüft dann nicht auf Gleichheit, sondern auf Einhaltung eines Toleranzbandes.</p> <pre><code class="block language-php.bad">// falsch: if ($a==$b) </code></pre> <pre><code class="block language-php"><span class="token comment">//besser:</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token operator">-</span><span class="token variable">$b</span><span class="token punctuation">)</span><span class="token operator"><</span><span class="token variable">$error</span><span class="token punctuation">)</span> </code></pre> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772790#m1772790 Rolf B 2020-06-30T19:35:52Z 2020-06-30T19:35:52Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Joachim,</p> <p>ok, darauf geht Janoschs Artikel nicht ein. Runden hilft Dir nicht. Wenn Du 42.01 auf 2 Nachkommastellen rundest, ist es immer noch eine Fließkommazahl die nicht genau dargestellt werden kann.</p> <p>Was Du tun musst, hängt von deiner Problemstellung ab. Wenn Du immer genau 2 Nachkommastellen hast, z.B. weil es Geld ist, dann rechne nicht mit Euro, sondern mit Cent. D.h. wenn Du "42.01" hereinbekommst, multipliziere es mit 100, addiere 0,5 und mache mit intval() eine Integerzahl draus.</p> <p>Könnte man in einer Funktion kapseln:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">toCents</span><span class="token punctuation">(</span><span class="token variable">$euro</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">intval</span><span class="token punctuation">(</span><span class="token variable">$euro</span> <span class="token operator">*</span> <span class="token number">100</span> <span class="token operator">+</span> <span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Wenn Du dagegen mit tatsächlichen Fließkommazahlen rechnen musst, dann ist der Test auf Gleichheit nicht mehr realisierbar. Statt dessen musst Du prüfen, ob die beiden Zahlen „nah genug“ beieinander liegen. Was „nah genug“ ist, kommt auf den Einzelfall an und muss bei jeder Rechnung neu überlegt werden. Du musst bedenken, dass ein double 15 signifikante Ziffern hat. Wenn deine Werte im Bereich von 1 liegen, dann liegt die "Auflösung" bei <code>1E-15</code>. Wenn deine Werte aber im Bereich von zehn Millionen liegen (was 7 Vorkommastellen sind), hast Du nur noch 8 Nachkommastellen. Die Auflösung liegt bei <code>1E-8</code>.</p> <p>Dein Schwellwert für "gleich genug" sollte 1-2 Größenordnungen über der numerischen Auflösung liegen, um Fehlerfortpflanzung in Rechnungen zu berücksichtigen.</p> <p>Statt <code>$a == $b</code> kannst Du also zum Beispiel <code>abs($a - $b) < 1E-13</code> testen. Oder <code>$a < $b - 1E-12</code> statt <code>$a < $b</code>. Das Spaceship kannst Du bei float vergessen. Und wie gesagt: Statt 1E-12 kann auch mal 1E-8 oder 0.001 korrekt sein, je nach Größenordnung der Zahlen, mit denen Du hantierst.</p> <p>Wenn Du vorher mit wilden Formeln herumgerechnet hast, musst Du deine Formeln eigentlich noch auf Fehlerfortpflanzung untersuchen, um zu wissen, wie groß dein Schwellwert für "nicht mehr gleich" sein muss. Je nachdem, wie Du rechnest, kann es auch sein, dass das Umstellen einer Formel den Rechenfehler massiv verbessert oder verschlimmert. Man kann statt Fehlerrechnung aber auch Testprogramme schreiben und die Formel mit verschiedenen Werten testen, um ein Gefühl für den durch Probieren herausbekommen.</p> <p>Aus gutem Grund ist Richtig Rechnen (a.k.a. Numerik) eins der gruseligsten Fächer im Mathe- oder Informatik-Studium.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772789#m1772789 Joachim 2020-06-30T19:22:21Z 2020-06-30T19:22:21Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Martin,</p> <blockquote> <p>Die übliche Strategie ist dann: Man legt eine maximal akzeptable Fehlerschwelle $error fest (z.B. $error=1E-6) und prüft dann nicht auf Gleichheit, sondern auf Einhaltung eines Toleranzbandes.</p> </blockquote> <p>Also eine Art Fuzzy-Logic Damit käme ich klar. Ich wußte nicht, ob es etwas "Besseres, Anderes, Klareres" gibt.</p> <p>Joachim</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772791#m1772791 Der Martin 2020-06-30T19:48:18Z 2020-06-30T19:48:18Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Rolf,</p> <blockquote> <p>Aus gutem Grund ist Richtig Rechnen (a.k.a. Numerik) eins der gruseligsten Fächer im Mathe- oder Informatik-Studium.</p> </blockquote> <p>ich habe das Thema weder im Mathe-LK in der Schule, noch im Informatik-Studium kennengelernt, sondern erst im Beruf bei der <s>Berech</s> Abschätzung von Messunsicherheiten.<br> Und ich stimme dir zu: Das ist ... naja, vielleicht nicht gruselig, aber doch sehr lästig.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772797#m1772797 Joachim 2020-07-01T07:18:07Z 2020-07-01T07:18:07Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo zusammen,</p> <p>sehr interessantes Thema und es wundert mich eigentlich, dass ich erst gestern darauf stoße. Dabei habe ich auch in der Vergangenheit oft mit Zahlen, auch Floatwerten gerechnet und sie verglichen.</p> <p>Im Grunde ist Deine Funktion toCents auch eine Art "Rundung". Ich hätte mir wirklich vorstellen können, dass PHP hier eigene Funktionen hat. </p> <p>Joachim</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772802#m1772802 Tabellenkalk 2020-07-01T09:25:18Z 2020-07-01T09:27:08Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo,</p> <blockquote> <p>Wenn Du immer genau 2 Nachkommastellen hast, z.B. weil es Geld ist, dann rechne nicht mit Euro, sondern mit Cent. D.h. wenn Du "42.01" hereinbekommst, multipliziere es mit 100, addiere 0,5 und mache mit intval() eine Integerzahl draus.</p> </blockquote> <p>Ich meine, mal gehört zu haben, dass das auch nicht der Weisheit letzter Schluss ist. Banken benötigen für Zinsrechnungen weit mehr als Cent-Genauigkeit, möglicherweise reichen Hundertstel-Cent. Aber wenn man Geldbeträge mit 10000 multipliziert, um genaustens rechnen zu können, stößt man viel schneller an speichergrenzen bei großen Beträgen... Ein Dilemma.</p> <p>Daher werden meines Wissens Euro und Cent irgendwie getrennt verwaltet. Das kann aber längst veraltet oder Einbildung sein…</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772792#m1772792 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2020-06-30T19:54:05Z 2020-06-30T19:54:24Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Der Martin,</p> <blockquote> <p>ich habe das Thema [Numerik] weder im Mathe-LK in der Schule</p> </blockquote> <p>ich kenne nicht einen einzigen Mathelehrplan, in dem das Thema Numerik stünde, wenn man mal von solchen Sachen wie dem Newton-Verfahren absieht, das sicherlich in dem einen oder anderen Bundesland in einem Wahlthema zu finden ist.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772793#m1772793 Rolf B 2020-06-30T20:21:08Z 2020-06-30T20:21:08Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Matthias,</p> <p>Schüler würden, wenn Du ihnen mit den Feinheiten der Fehlerrechnung kommst, schreiend das Gebäude verlassen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772794#m1772794 Der Martin 2020-06-30T20:55:27Z 2020-06-30T20:55:27Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo,</p> <blockquote> <p>Schüler würden, wenn Du ihnen mit den Feinheiten der Fehlerrechnung kommst, schreiend das Gebäude verlassen.</p> </blockquote> <p>das kann sein - ich weiß nicht, wie ich als Schüler reagiert hätte. Aber als ich mit den üblichen Methoden der Fehlerrechnung konfrontiert wurde, habe ich erstmal protestiert: Das stimmt doch gar nicht!</p> <p>Die traditionelle Methode besagt: Ergibt sich eine Größe als Produkt aus n einzelnen Messgrößen, die alle mit einer gewissen prozentualen Unsicherheit behaftet sind, addiere einfach die Prozentwerte, um die resultierende Unsicherheit zu erhalten.</p> <p>Stimmt nicht. Angenommen, ich messe Spannung und Strom mit einer Unsicherheit von je 10%, dann würde ich nach der beschriebenen Methode eine Unsicherheit von 20% für die Leistung bekommen. Tatsächlich sind es aber 21%, denn 1.1² = 1.21.</p> <p>In der HF-Messtechnik, wo viele Größen in dB gemessen werden, passt das wieder.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772796#m1772796 Der Martin 2020-07-01T06:33:33Z 2020-07-01T06:33:33Z Brett vorm Kopf. Finde den Fehler nicht. <p>Moin,</p> <blockquote> <p>könnte man nicht mit Hilfe von <a href="https://www.php.net/manual/en/function.decbin" rel="nofollow noopener noreferrer"><code>decbin()</code></a> nachgucken, was PHP da im Hintergrund macht?</p> </blockquote> <p>was willst du damit herausfinden? Das liefert dir nur einen String mit der binären Darstellung einer Zahl. Also decbin(200) ergibt z.B. den String "11001000".</p> <p>Das hat nichts mit der internen Darstellung oder Speicherung von Variablenwerten zu tun.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772799#m1772799 Rolf B 2020-07-01T07:29:08Z 2020-07-01T07:29:38Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Graf,</p> <p>im Gegensatz zur Doku wandelt decbin keinen <strong>dezimalen</strong> Wert ins Binärformat, sondern nur einen <strong>Integer</strong>-Wert. D.h. decbin(42.02) ergibt 101010, die Binärdarstellung von 42.</p> <p>Etwas näher könnte man der Sache mit debug_zval_dump() kommen - aber der lügt ebenfalls und sagt nur: <code>double(42.02)</code>. Dass da nicht 42.02 in der Variablen steht, sondern</p> <p>$$\displaystyle \frac{5913789260690883}{140737488355328} = 42.02000000000000312638803734444081783294677734375$$</p> <p>(danke an <a href="https://www.binaryconvert.com/result_double.html?decimal=052050046048050" rel="nofollow noopener noreferrer">binaryconvert.com</a> und <a href="https://www.wolframalpha.com/input/?i=10101000000101000111101011100001010001111010111000011_2+%2F+2%5E47" rel="nofollow noopener noreferrer">Wolfram Alpha</a>), das verrät er nicht.</p> <p>Was intern passiert, ist übrigens <a href="https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772768#m1772768" rel="noopener noreferrer">längst klar</a>.</p> <p>Liebe Grüße an den edlen Cousin, Graf Zahl!<br> <em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772798#m1772798 Der Martin 2020-07-01T07:26:59Z 2020-07-01T07:26:59Z Brett vorm Kopf. Finde den Fehler nicht. <p>Moin Joachim,</p> <blockquote> <p>sehr interessantes Thema und es wundert mich eigentlich, dass ich erst gestern darauf stoße. Dabei habe ich auch in der Vergangenheit oft mit Zahlen, auch Floatwerten gerechnet und sie verglichen.</p> </blockquote> <p>das geht auch oft gut, aber irgendwann stößt man mal auf das Thema. Als Beispiel wird auch oft demonstriert, einen Startwert (z.B. 1.00) in einer Schleife pro Durchlauf um 0.10 zu erhöhen. Meist läuft das schon beim dritten oder vierten Schritt aus dem Ruder.</p> <blockquote> <p>Im Grunde ist Deine Funktion toCents auch eine Art "Rundung".</p> </blockquote> <p>Ja, aber nur einmalig, um von da an mit ganzzahligen Werten weiterzurechnen und weitere Rundungsfehler auszuschließen.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772801#m1772801 Der Martin 2020-07-01T09:04:09Z 2020-07-01T09:04:09Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Rolf,</p> <blockquote> <p>im Gegensatz zur Doku wandelt decbin keinen <strong>dezimalen</strong> Wert ins Binärformat, sondern nur einen <strong>Integer</strong>-Wert. D.h. decbin(42.02) ergibt 101010, die Binärdarstellung von 42.</p> </blockquote> <p>das stimmt, der Name der Funktion ist schlecht gewählt.</p> <p>Einerseits ist <em>dezimal</em> hier nicht im Sinn eines Dezimalbruchs gemeint, sondern als Abgrenzung der Dezimaldarstellung einer Zahl zu anderen Zahlensystemen (hexadezimal, oktal).</p> <p>Andererseits ist auch das Unsinn, denn die Darstellung einer Zahl in irgendeinem Zahlensystem hat nichts damit zu tun, wie sie intern gespeichert wird. Mit decbin(0x1F04) würde ich die Bezeichnung ad absurdum führen.</p> <p>Daher wäre <strong>intbin</strong> tatsächlich die bessere, weil treffendere Bezeichnung.</p> <blockquote> <p>Etwas näher könnte man der Sache mit debug_zval_dump() kommen</p> </blockquote> <p>Oh, interessant. Das kannte ich noch gar nicht.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772894#m1772894 Graf Bit 2020-07-03T04:26:14Z 2020-07-03T04:26:14Z Float binär darstellen <p>Hallo Ro.,<br> hallo @all,</p> <blockquote> <p>im Gegensatz zur Doku wandelt decbin keinen <strong>dezimalen</strong> Wert ins Binärformat, sondern nur einen <strong>Integer</strong>-Wert. D.h. decbin(42.02) ergibt 101010, die Binärdarstellung von 42.</p> <p>Etwas näher könnte man der Sache mit debug_zval_dump() kommen - aber der lügt ebenfalls und sagt nur: <code>double(42.02)</code>. Dass da nicht 42.02 in der Variablen steht, sondern</p> <p>$$\displaystyle \frac{5913789260690883}{140737488355328} = 42.02000000000000312638803734444081783294677734375$$</p> <p>(danke an <a href="https://www.binaryconvert.com/result_double.html?decimal=052050046048050" rel="nofollow noopener noreferrer">binaryconvert.com</a> und <a href="https://www.wolframalpha.com/input/?i=10101000000101000111101011100001010001111010111000011_2+%2F+2%5E47" rel="nofollow noopener noreferrer">Wolfram Alpha</a>), das verrät er nicht.</p> <p>Was intern passiert, ist übrigens <a href="https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772768#m1772768" rel="noopener noreferrer">längst klar</a>.</p> <p>Liebe Grüße an den edlen Cousin, Graf Zahl!</p> </blockquote> <p>Ok, reingefallen.</p> <p>Kennt denn irgendjemand hier eine Methode, um sich die Float-Werte binär darstellen zu lassen, also quasi ein direktes Speicherabbild der Variable zu visualisieren?</p> <p>Bit frei!<br> Graf Bit</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772803#m1772803 Rolf B 2020-07-01T09:33:05Z 2020-07-01T09:33:05Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo encoder,</p> <blockquote> <p>Die einzelne Zahl 188.2 lässt sich dagegen ohne Rundungsfehler darstellen</p> </blockquote> <p>Auch ohne einen IEEE754 Konverter widerspreche ich da. 0,2 ist $$\frac{1}{5}$$, das kannst Du nie als endliche Summe von Zweierpotenzen darstellen.</p> <p><a href="https://www.binaryconvert.com/result_double.html?decimal=049056056046050" rel="nofollow noopener noreferrer">IEEE754-Darstellung von 188,2</a>.</p> <p>So wie es aussieht, ist</p> <p>$$188{,}2 = 10111100{,}\overline{0011}$$</p> <p>Oder, klassisch konvertiert wie man es bei Dezimalbrüchen gelernt hat:</p> <p>$$188{,}2 = 188 + \frac{1}{5} = 188 + \frac{3}{15} = 10111100_2 + \frac{0011_2}{1111_2} = 10111100{,}\overline{0011}_2$$</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772804#m1772804 Der Martin 2020-07-01T09:33:16Z 2020-07-01T09:33:16Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hi,</p> <blockquote> <blockquote> <p>Wenn Du immer genau 2 Nachkommastellen hast, z.B. weil es Geld ist, dann rechne nicht mit Euro, sondern mit Cent. D.h. wenn Du "42.01" hereinbekommst, multipliziere es mit 100, addiere 0,5 und mache mit intval() eine Integerzahl draus.</p> </blockquote> <p>Ich meine, mal gehört zu haben, dass das auch nicht der Weisheit letzter Schluss ist. Banken benötigen für Zinsrechnungen weit mehr als Cent-Genauigkeit, möglicherweise reichen Hundertstel-Cent.</p> </blockquote> <p>das fängt bei den Tankstellen schon an, die zumindest intern auch mit den Zehntel-Cent rechnen.</p> <blockquote> <p>Aber wenn man Geldbeträge mit 10000 multipliziert, um genaustens rechnen zu können, stößt man viel schneller an speichergrenzen bei großen Beträgen... Ein Dilemma.</p> </blockquote> <p>Tja, irgendeinen Haken gibt's immer. <br> Es gibt noch andere Möglichkeiten. Traditionelle Taschenrechner verwenden AFAIK BCD-Arithmetik, d.h. Zahlen werden intern als BCD gespeichert und verarbeitet. So kann man zumindest im Dezimalsystem, das ja die meisten von uns primär verwenden, ohne Rundungsfehler rechnen.</p> <blockquote> <p>Daher werden meines Wissens Euro und Cent irgendwie getrennt verwaltet. Das kann aber längst veraltet oder Einbildung sein…</p> </blockquote> <p>Ich kann mir nicht vorstellen, was das für einen Vorteil bringen könnte.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772806#m1772806 Rolf B 2020-07-01T10:10:43Z 2020-07-01T10:10:43Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hallo Tabellenkalk,</p> <blockquote> <p>Banken benötigen für Zinsrechnungen weit mehr als Cent-Genauigkeit, möglicherweise reichen Hundertstel-Cent.</p> </blockquote> <p>Ich bin damals bei der Euro-Konvertierung unseres Versichertenbestandes nicht beteiligt gewesen, ich weiß aber, dass der Standard-Eurorechner, den wir damals zugekauft hatten (sic!) mit Hundertstel-Cent gerechnet hat. Und ich meine mal irgendwo gelesen zu haben, dass im Buchhaltungswesen das Rechnen mit Hundertstel-Cent und genaue Vorschriften, wann wie zu runden ist, vorgegeben sind. Das mag aber jetzt Fake-Memory sein.</p> <p>Euro und Cent getrennt zu verwalten, tja, das ist ggf als Workaround nötig und wird bei Punktrechnung umständlich. Aber nötig ist es nur bei alter Software. Der Klassiker ist hier COBOL mit dem COMP-3 Format, das früher maximal 18 Ziffern konnte (entspricht dem Umfang eines 64-bit Integer). Wenn man sich dem Billiardenbereich nähert, ist man bei 4 Nachkommastellen am Ende. Der IBM Compiler hat die ARITH(EXTEND) Option, dann wird der Code langsamer, kann aber 31 Ziffern verarbeiten. Der .net Decimal Typ kann 28 Ziffern. Mit diesen Grenzen hat vermutlich nur <a href="https://de.wikipedia.org/wiki/Venezolanischer_Bol%C3%ADvar#Bol%C3%ADvar_soberano_(seit_20._August_2018)" rel="nofollow noopener noreferrer">Venezuela</a> ein Problem, aber die haben ja auch Übung in Währungsschnitten.</p> <p>Java legt mit BigDecimal deutlich was drauf, und in JavaScript kann man immerhin BigInt verwenden.</p> <p>IBM COBOLs Datenbankpartner DB2 speichert 31 stellige Decimals, MS SQL Server speichert DECIMAL bis zu 38 Ziffern und MySQL bis 65.</p> <p>Also - machbar ist's auch ohne Cent-Quarantäne.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772848#m1772848 encoder 2020-07-01T21:35:56Z 2020-07-01T21:35:56Z Brett vorm Kopf. Finde den Fehler nicht. <p>Mit dieser Argumentation stimmt das.<br> Dann stellt die Seite das wohl falsch dar und rundet sich irgendwas schön.</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772805#m1772805 MudGuard http://www.andreas-waechter.de/ 2020-07-01T09:40:09Z 2020-07-01T09:40:09Z Brett vorm Kopf. Finde den Fehler nicht. <p>Hi,</p> <blockquote> <p>Tja, irgendeinen Haken gibt's immer. <br> Es gibt noch andere Möglichkeiten. Traditionelle Taschenrechner verwenden AFAIK BCD-Arithmetik, d.h. Zahlen werden intern als BCD gespeichert und verarbeitet. So kann man zumindest im Dezimalsystem, das ja die meisten von uns primär verwenden, ohne Rundungsfehler rechnen.</p> </blockquote> <p>Nö, denn der Speicher ist begrenzt - Brüche wie 1/3 oder 1/7 werden also irgendwo irgendwie gerundet ...</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772900#m1772900 Rolf B 2020-07-03T07:12:36Z 2020-07-03T07:12:36Z Float binär darstellen <p>Hallo Graf Bit,</p> <p>wenn Du die interne Repräsentation einer Variablen in PHP abrufen willst, dann solltest Du den Gedanken gleich wieder streichen. Abgesehen davon bietet Dir PHP, solange Du nicht selbst eine Erweiterung programmierst, keinen Zugang zu den internen Strukturen.</p> <p><a href="https://nikic.github.io/" rel="nofollow noopener noreferrer">Nikita Popov</a> von Jetbrains (die Macher von PHPStorm) hat in den letzten Jahren wenig gebloggt, aber: er hat 2015 zwei ausführliche Artikel über die interne Ablage von PHP 7 Variablen geschrieben und es auch mit PHP 5 verglichen.</p> <p>TL;DR: Diese Speicherung ist versionsabhängig und kann sich mit jedem PHP Release ändern.</p> <p>Aber um dem double-Problem auf die Spur zu kommen: PHP führt bei der String-Umwandlung eines double-Wertes offenbar selbst schon eine Rundung durch, um diese winzig kleinen IEEE-754 Abweichungen zu kompensieren. Wenn Du diese Rundung aushebeln willst, kannst Du printf statt echo verwenden (oder sprintf, wenn Du es in einem String speichern statt ausgeben willst):</p> <pre><code class="block language-php"><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"%.53f"</span><span class="token punctuation">,</span> <span class="token number">42.02</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Schreibt 42.02000000000000312638803734444081783294677734375000000</span> </code></pre> <p>Das passt zu dem, was der binaryconverter erzeugt hat, den ich verlinkt hatte.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div>