NEWS
Fehler in Blockly acos
-
Hallo,
ich wollte das Volumen eines liegenden Zylinders in Blockly berechnen und habe dabei einen Fehler in Blockly festgestellt.
Gibt man in blockly acos 0,8 und wechselt dann zur JS Ansicht taucht folgendes auf "erg = Math.acos(0.8) / Math.PI * 180;". An dieser Stelle ist das Math.PI*180 zu viel und verursacht in der Folge einen Fehler den man an dieser Stelle noch gar nicht merkt. Wenn ich den Fehler mit "erg= (Math.acos(my_1_h_r) / Math.PI * 180) / (Math.PI * 180);" korregiere hilft das leider nicht wirklich, da trotzdem ein Rundungsfehler entsteht der dazu führt, dass mathematisch in einen 6000 Liter Tank plötzlich 6100 Liter passen.Ab hier das ganze zum nachvollziehen. Hier die Formel mit Beispielrechnung, die stimmt.
Hier das fehlerhafte Blockly zum einfügen mit der gleichen Formel (leicht geändert für Blockly)
var h, L, r, my_1_h_r, r_C2_B2, acos1_h_r, Teil_1, test, r_h, h_C2_B2, my_2_r_h, my_2_r_h_h_C2_B2, w_aus_2_r_h_h_C2_B2, Teil_2, ZwE, Erg; schedule("*/5 * * * * *", function () { h = 158; L = 340; r = 79; // Erg = L * ((r²*arccos (1-(h/r))-((r-h)*Wurzel(2*r*h(-h²))))) // Teil 1 (r²*arccos (1-(h/r)) my_1_h_r = 1 - h / r; r_C2_B2 = r * r; acos1_h_r = (Math.acos(my_1_h_r) / Math.PI * 180) / (Math.PI * 180); Teil_1 = r_C2_B2 * acos1_h_r; test = 19.6066797510539; // Teil 2 ((r-h)*Wurzel(2*r*h(-h²)))) r_h = r - h; h_C2_B2 = h * h; my_2_r_h = 2 * r * h; my_2_r_h_h_C2_B2 = my_2_r_h - h_C2_B2; w_aus_2_r_h_h_C2_B2 = Math.sqrt(my_2_r_h_h_C2_B2); Teil_2 = r_h * w_aus_2_r_h_h_C2_B2; ZwE = Teil_1 - Teil_2; Erg = L * Teil_1; console.warn((String(Erg / 100) + ' von 6666,3L')); });
Hier noch mal ein Nachbau in Java Script, der funktioniert und richtig rechnet
var Erg , h , L , r; schedule("*/5 * * * * *", function () { h = 158;// - (getState("sonoff.0.Oel1.SR04_Distance").val); // Füllhöhe des liegenden Zylinders L = 340; // Länge des Zylinders r = 79; // Radius // Formel ******************************************************** // Erg = L * ((r²*arccos * (1-(h/r))-((r-h)*Wurzel(2*r*h(-h²))))) // Prüfung https://www.scalesoft.de/math/tank/tank.html // *************************************************************** // Berechnung Erg = L * ((r * r * Math.acos(1 -(h / r)))-( r - h) * Math.sqrt(2 * r * h -(h * h))); //console.warn((String(Math.round((Erg / 1000)*10)/10) + ' von 6666,3L')); console.warn((String(Erg / 1000) + ' von 6666,3L')); });
Ergebnis in Blockly trotz Korrektur "6754.344798888328 von 6666,3L"
Richtiges Ergebnis in Java Script sowie auf der Webpage "6666.271115358326 von 6666,3L"Könnte man das ganze prüfen und ggf. korregieren?