Path: csiph.com!aioe.org!news.mb-net.net!open-news-network.org!.POSTED.178.197.220.186!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: de.comp.lang.javascript Subject: Re: Fehler bei Berechnungen in JavaScript Date: Mon, 29 Nov 2021 00:51:25 +0100 Organization: PointedEars Software (PES) Lines: 125 Message-ID: <10054887.QKATZ9b1sv@PointedEars.de> References: <1679766.OeldK439Yt@PointedEars.de> <2651122.v9v1EOSiMG@PointedEars.de> Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit Injection-Info: gwaiyur.mb-net.net; posting-host="178.197.220.186"; logging-data="1292144"; mail-complaints-to="abuse@open-news-network.org" User-Agent: KNode/4.14.10 Cancel-Lock: sha1:nQl/FTgfZWve/PNySYvPr/Aaagw= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEXTxa4RFk5dUWANED8PFEfy7+MGBiW+n3ZNF/QuAAACaElEQVQ4jVXUwVOcMBQG8Dc7Rc4PUntdWV2uxjDpGaGeozOp1woar4jd5t/v9wLstMwsA/ntlxdCAgUc1hjTc9/JCZfGoo3wG3HdmdAWrIJRHe7GM/TmpY5VFefuVcAkkPbLIaN8rmPmjloyZxgyR3GuJ4K0AGtJ2htz8o7yqikm759fldQXaMpbDzjKAG+8v+AugVTOPO5DOjLvGtUYQwh0CPjnVMyGd+8/GfUB5nLKJDD2aLDh5HYyMDJGDwQIo2ZmZcKbowNmAdB/AzyFhrmF2MHRb0QJJfaAnwGB6orZhoykLzJtGwF/xpYxI1dswomiUj3gTuAIqCn/4C7cULwGNBtwMTk3Y4LfKB5YUaOKBKYtpplm7u0vip8tU1NWWyI/7XdcSuIDoMt6rVHMWT0DbjHPGqDqZVSa6zleLcUTcIKLoMv3ueJluALtAo9B302zPPlrtiVScRdCjXvVh3e3JpYa/jjkuC9N+LrBMlz/eAN4eQijX2EdLo6c5tGGHwLyHFtXk89dDGHwCVhG9T0S/j55AhRZgkMCmUQXJ49TnS1wnQDvw0eAh9ICeMmEFbCnPMFzjAvsWoEWEFdYEx+S0MoUZ1gT1wId8+AF3Bl2OoEu906AUHx5VLw/gXYg/x84loOah/2UYNrgiwSwGO7RfUzVBbx/kgpckumGOi6QirtD6gkLTitbnxNol47S2jVc2vsN5kPqaAHT8uUdAJM4v/DanjYOwmUjWznGfwB7sGtAtor5BgofDuzaRj4kSQAqDakTsKORa3Q3xKi3gE1fhl71KRMqrdZ2AWNNg/YOhQyrVBnb+i+nEg4bsDA+egAAAABJRU5ErkJggg== X-User-ID: U2FsdGVkX19DsC4PxQ8qxBVhMKVIUOuGiTOA9SbUSeH6Y+9/k3+PgA== X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&. Am 28.11.2021 um 00:53 schrieb Arno Welzel: >> *Welche* Probleme? >> >> Was erwartest Du als Ergebnis und was erhältst Du statt dessen? > > Zunächst habe ich Fehler in den Berechnungsformeln beseitigt.- > Aktuell habe ich das Problem, dass das e, unten in cosen() zu NaN wird, > und ich das nicht durchschaue. :( Nochmals: *Benutz* *einen* *Debugger*. Der entsprechende Code lesbar geschrieben und grobe Fehler (nicht deklarierte Variablen) korrigiert (einige Debugger können ersteres bis zu eineem gewissen Grad): function cosen (t, bb, lb, pi, nwk, neig, rif) { /* Längengrad Sonne */ let ls = 2*pi/24 * t - pi; /* Breitengrad Sonne */ let bs = Math.sin(2*pi/8760 * t - pi/2) * nwk; let cose1 = Math.cos(bb) * Math.cos(ls - lb); let h = Math.acos(cose1); let ri = Math.abs( Math.acos(-Math.sin(bb) * cose1 / Math.cos(bb) / Math.sin(h)) ); /* Richtung zur Sonne */ let vz = Math.sin(ls - lb)/Math.sin(h); if (vz < 0) ri = -ri; let ele = pi/2 - Math.acos( Math.sin(bb) * Math.sin(bs) + Math.cos(bb) * Math.cos(bs) * Math.cos(ls - lb) ); /* Sonnenhöhe */ let e; if (ele <= 0) { e = 0; ele = 0; } else { e = (-Math.cos(ele) * Math.sin(neig) * Math.cos(ri - rif) + Math.sin(ele) * Math.cos(neig)) / Math.sin(ele); } if (e <= 0) e = 0; /* DEBUG */ console.log(ri * 180/pi); return e; } (Das nächste Mal bitte selbst machen.) Mit diesem nun lesbareren Code sollte spätestens jetzt klar sein, dass e nur genau dann NaN sein kann, wenn einer der Faktoren im Zähler oder der Nenner NaN ist [ist hingegen Math.sin(ele) === 0, dann ist e === Infinity]. Das ist genau dann der Fall, wenn mindestens eines der Argumente der Methoden NaN ist – also ele, neig, oder ri - rif. Letzteres kann dann NaN sein, wenn ri oder rif NaN sind. Und so weiter. Und Deine nachträgliche Korrektur if (e <= 0) e = 0; trifft AISB auf Number.isNaN(e) NICHT zu, da (NaN <= 0) === false. Deswegen kann e bei der return-Anweisung NaN sein. Ich würde übrigens π (und allgemein echte Konstanten, die nicht als Platzhalter dienen) NICHT als Argument (hier: pi) übergeben; schon allein weil die Parameterwerte in einer Funktion versehentlich modifiziert werden könnten (dagegen hilft auch der Strict Mode nicht). Ausserdem bläht es die Funktionssignatur unnötig auf und widerspricht dem Gesetz von Demeter (“Black box”-Prinzip). Wenn Du nicht ständig Math.PI schreiben willst, dann deklarier Dir eine globale Konstante oder (besser) eine Modulkonstante: let myMod = (function () { /* Module constants */ const PI = Math.PI; /* Private functions */ function _privateFunctionName (…) { … PI … } /* Public properties */ return { publicMethodName: function (…) { … _privateFunctionName(…) … } }; }()); Irnkwo im HTML-Code: … myMod.publicMethodName(…); … Die Bezeichner sind geeignet zu ändern. Auch ist “e” ein schlechter (weil mehrdeutiger) Variablenbezeichner. -- PointedEars FAQ: | | Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.