Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Runden einer Zahl nicht exakt > Exceeded maximum stack depth

20 views
Skip to first unread message

Thomas 'PointedEars' Lahn

unread,
Mar 18, 2013, 3:41:16 PM3/18/13
to
Nico Grebner wrote:

> ich habe ein Problem beim Runden einer Zahl. Ich muss diese Zahl einmal
> auf- und einmal abrunden, um eine Interpolation durchzuführen.
>
> Hierzu verwende ich folgenden (verkürzten) code:

[Quelltext auf das Wesentliche reduziert und lesbar formatiert]
> ####
> {
^
Das ist *so* eine überflüssige Block-Anweisung (oder ist das bloss Dein
missglückter Versuch, in einem Klartextmedium Quelltext als solchen
auszuzeichnen?). Sie sorgte _nicht_ dafür, dass der darin eingeschlossene
Code lokal ist. Sie sorgte allerdings dafür, dass

> function test2 ()
> {
> var tst = getFactor(0.24, 6);
^^^^
> }

nicht standardkonform wäre, denn Funktionsdeklarationen sind gemäss Standard
(ECMAScript Language Specification, 5.1 Edition) innerhalb von Block-
Anweisungen nicht erlaubt.

> function getFactor(m, h)
> {
> switch (m)
> {
> case 0.2: return m * (1 + 0.044 * (h - 4.5));
^^^
> case 0.3: return m * (1 + 0.066 * (h - 4.5));
^^^
> default:
> var lowerM = Math.floor(m * 10) * 0.1;
> var upperM = Math.ceil(m * 10) * 0.1;
> var lowerFactor = getFactor(lowerM, h);
> var upperFactor = getFactor(upperM, h);
> var interpolFactor =
> (upperFactor - lowerFactor)
> / (upperM - lowerM) * (m - lowerM) + lowerFactor;
> return interpolFactor;
> }
> }
>
> }
> ####
^^^^
> Ich erhalte die Fehlermeldung: Exceeded maximum stack depth (Zeile: var
> lowerFactor = getFactor(lowerM, h);)
> […]
> Wenn ich jetzt das Runden wie folgt ändere,
> ####
> {
^^^^
Schon wieder.

> var lowerM = Math.floor(m * 10) / 10;
> var upperM = Math.ceil(m * 10) / 10;
> }
> ####
^^^^
> läuft mein Code oben wie gewünscht und liefert das richtige Ergebnis. Das
> habe ich in Google Apps Script getestet.

IMHO reiner Zufall.

> Das ganze soll nun als „custom function“ in einem Google Spreadsheet
> laufen. Dort bekomme ich jedoch in der Zelle, in der ich die Funktion
> aufrufe, auch mit der letzten Änderung die Fehlermeldung: „Exceeded
> maximum stack depth“
>
> Der Fehler liegt ja offenbar darin, dass ich mit Math.floor(m * 10) die
> abgerundete Zahl (*10) bekomme und durch die Anweisung „/10“ bzw. „*0.01“
> eine nicht exakte Zahl bekomme (0.200000000001).

Richtig.

> Kann mir hier jemand weiterhelfen?

Ja. Die Antwort auf die Frage, die Du nicht gestellt hast, lautet jedoch:

So kann das nicht funktionieren. Standardkonforme ECMAScript-
Implementierungen verwenden schon immer als *einzigen* numerischen Datentyp
Fliesskommazahlen mit „doppelter Genauigkeit“ gemäss IEEE-754.

Übrigens empfehle ich Dir dringend, nicht über Google Groups ins Usenet zu
posten. Dessen Interface ist noch zusätzlich zu Deinem eigenwilligen
Postingstil völlig kapott.

<http://www.tty1.net/smart-questions_de.html>

--
PointedEars

Twitter: @PointedEars2
Please do not Cc: me. / Bitte keine Kopien per E-Mail.
0 new messages