SOFiSTiK Forum

It is currently Sun Sep 22, 2019 12:46 pm

All times are UTC




Post new topic Reply to topic  [ 1 post ] 
Author Message
PostPosted: Tue Oct 20, 2015 2:51 pm 
Offline

Joined: Wed Apr 02, 2014 11:15 am
Posts: 10
Hallo lb Kollegen,

ich befasse mich nun schon seit geraumer Zeit mit einer Implementierung, bei der ich notgedrungen mit recht großen bzw. kleinen Zahlen zu tun habe.
Da ich leider in der Hilfe nichts Vergleichbares dazu finden konnte, wollte ich wissen, welchen Zahlenbereich Sofistik nun tatsächlich unterstützt.

In einem anderen Thread schreibt Hr. Fahrendholz, dass Sofistik CADINP Variablen als Float-Zahlen (4 Byte) behandelt. Lt. dieser Website wird deren Range mit 1.2E-38 bis 3.4E+38 angegeben. So weit, so schlecht.

Angenommen, ich führe nun folgendes Template aus
Code:
+prog template

                let#t0 1013
                let#lbd -0.9828
                let#fak 1.0

                let#m_f1 #lbd
                let#m_f2 exp(#lbd*#t0/24)*#fak
                let#mm #m_f1*#m_f2

                prt#mm

ende

so wird die Variable #mm als "0" ausgegeben, da #m_f1 von Sofistik zu "0" gesetzt wird, obwohl dies - dem Range - nach gar nicht sein dürfte. Ein kurzer Blick in den TI verrät, dass exp(-0,9828*1013/24) lediglich "9,64812E-19" ist; also eine Zahl, die noch ohne Probleme dargestellt werden sollen könnte.

Das Problem daran ist, dass mir diese "0" eine mit diesem Wert aufgebaute Matrix zerschießt, die dann nicht mehr gelöst werden kann. - Ich habe zunächst einen "Workaround" eingebaut, in dem die Variable #fak eine Art Skalierungsfaktor darstellt. - Wenn man die hier z.B. auf 1e20 setzt und dann das Template ausführt, funktioniert die Sache.

Ebensowenig finde ich nachvollziehbar, wie es möglich ist, dass beispielsweise #fak auf 1e99 (!) gesetzt werden kann und man dann als Ergebnis für #mm -0,9482E+81 erhält. - Eine Zahl die ebenfalls den Range sprengen sollte.
Wird der Skalierungsfaktor nun auf #fak 1e100 gesetzt gibt es eine Fehlermeldung, da - so meint man - nun der Zahlenbereich völlig erschöpft ist. Komischerweise führt folgendes Template
Code:
+prog template

                let#a 1e20
                let#b 1e90
                let#c #a*#b
                prt#c

ende

zu dem mir schleierhaften Ergebnis 0,1+111 (zwar ohne 'E' in der Darstellung, aber immerhin dennoch gerechnet, obwohl das meiner Meinung nach einerseits im Widerspruch zum float-Range, andererseits im Widerspruch zur vorhergehenden Fehlermeldung führt).

Allem Anschein nach, macht es auch einen Unterschied, ob eine Variable Sofistik-Intern berechnet wird, d.h. "#a*#b" für "#c"; oder ob diese als Literal eingegeben wird z.B. "let#c 0,1e+111".

Irgendwie kann ich dieses Verhalten überhaupt nicht nachvollziehen. Dadurch erschwert es mir auch, meinen Gleichungslöser (Gauss-Elimination mit Pivoting, der leider notgedrungen mit sehr kleinen Zahlenwerten im Bereich von 1e-22 abwärts arbeiten muss) in irgendeiner Form zu adaptieren, sodass dies möglich wäre.

...

Hat hier irgendjemand eine Idee/Rat/Antwort, was dieses Verhalten von Sofistik betrifft bzw. wie man dem evtl. abhelfen könnte?

mlg
pjheinrich


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 6 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group