Seite 1 von 3

[Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 20:34
von GPI
Das hier ist meiner Meinung nach etwas ungünstig ausgedrück.
Eine weitere Einschränkung von Fließkomma-Zahlen ist, dass sie stets im Binärmodus arbeiten, weshalb sie nur die Zahlen exakt speichern können, welche mittels Multiplikation oder Division mit 2 ermittelt werden können. Dies ist insbesondere wichtig zu wissen, wenn Sie versuchen, eine Fließkommazahl in einer visuell lesbaren Form darzustellen (oder mit ihr Rechenoperationen auszuführen) - das Speichern von Zahlen wie 0.5 oder 0.125 ist einfach, da sie Divisionen von 2 sind. Das Speichern von Zahlen wie 0.11 ist schwieriger, diese wird möglicherweise als Zahl 0.10999999 gespeichert. Sie können versuchen, nur eine begrenzte Anzahl an (Nachkomma-) Stellen darzustellen, seien Sie aber nicht überrascht, wenn die Darstellung der Zahl anders aussieht, als Sie dies erwarten!


Grober Vorschlag:
Eine weitere Einschränkung von Fließkomma-Zahlen ist, das sie mit der Basis 2 arbeiten. Deshalb kann es Vorkommen kann, das manche Zahlen aus den 10er-System - welches wir normal verwenden - nicht richtig dargestellt werden können. Bsp. kann man die Zahl 0,4 nicht korrekt darstellen. Dies ist allerdings keine Einschränkung von PureBasic sondern ein Generelles Problem. Versuchen sie einfach mal die Rechnung 1/3 in 10er-System darzustellen - es wird nicht klappen. Bei einen Zahlenbasis von 3 wäre es einfach: 0,1.

In Zehner-System werden Stellen mit 10^x bestimmt werden. 10^2=100, 10^1=10, 10^0=1, 10^-1=0.1, 10^-2=0.01.
Beim 2-System ist es folgerichtig: 2^2=4, 2^1=2, 2^0=1, 2^-1=0.5, 2^-2=0.25 usw.
und eben mit .25, .125 etc. wird man nie .4 oder .11 darstellen können.

Der Compiler wird zwar 0.4 ausgeben, dieser Wert entsteht aufgrund von Rundungen!

Ein sehr einfaches Beispiel für die Problematik wäre das hier:

Code: Alles auswählen

Debug 1000.11-1000.4
ergibt: -0.28999999999996362

Wie gesagt: Es PB bzw. der Computer verrechnet sich nicht, es sind Umrechnungsfehler, die hier sehr böse zuschlagen.

Fließkommazahlen sollten daher immer als Schätzwert angesehen werden. Solltet ihr mal Berechnungen in Währungen haben, die absolut richtig sein müssen, rechnet immer in der kleinsten einheit. Bei unserer Währung wäre es dann Cent. Bei der Ausgabe kann man dann einfach mit Strings arbeiten. Das Ergebnis in einen String umwandeln und anschließend die letzen beiden Zeichen für die Cent-Angabe benutzen.

Eine andere Sache ist bspw. wenn ihr bspw. abfragen wollt, ob ein Ergebnis Null ergibt, sollte man eventuell nicht genau mit

Code: Alles auswählen

if a.f=0 
überprüfen, sondern eventuell so:

Code: Alles auswählen

if a.f<0.5 and a.f>-0.5
oder entsprechende Grenzen.
Man könnte hier noch ein Beispiel für die Umwandlung einbauen, indem man manuell einmal 0.2 mal in binär umwandelt und das mal mit .4 versucht.

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 21:29
von GPI
ich mach mal einfach hier weiter wenn ich was finde...

Beim Thema Gosub/Return

würd ich persönlich eine große Warnbox drüber schreiben
Achtung!
Die Steuerwörter Gosub, Return und Goto sind primär aus Kompatiblitätsgrunden enthalten. In 99% aller Fälle sollte man diese Aufrufe vermeiden und Prozeduren benutzen, da Gosub kein struckturierten und sauberen Quellcode ermöglichen.
Bei If : Else : EndIf
Ich würde unten anfügen:
Hinweis:
In Gegensatz zum Basic-Standard kennt PB kein "THEN". dieses Steuerwort kann einfach ersatzlos weggelassen werden.

Will man in einer Zeile ein If-Statement bringen, muss man mit : und ENDIF arbeiten!
If a=10 : Debug "a=10" : ENDIF
Structure
Erklärung der Geschweiften Klammern fehlt. Siehe Beispiel:

Code: Alles auswählen

Structure date
    day.s{2}
    pk1.s{1}
    month.s{2}
    pk2.s{1}
    year.s{4}
  EndStructure

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 21:32
von STARGÅTE
Du spielst vermutlich auf die häufigen Fragen rund um Floats an ?

Ohne dein Vorschlag "zu nichte zu machen",
würde es voll außreichen Quellen im Internet anzugeben.
zB. Wiki : Gleitkommazahl

So müsste man sich nicht selber gedanken über eine Formulierung machen, bei der so oder so trotzdem weiter "solche" Fragen kommen. Zusätzlich hat man gleich dort weiterführende Links ...

Aber das sollen die Autoren entscheiden.
Aber ich gebe dir recht, die aktuelle Formulierung ist etwas "schwammig".

EDIT:
Zu den Strukturen, { } sind bei Typen erklärt:
"Fixed (fester) ; String .s{Länge} ; Länge des Strings ; unlimitiert "


EDIT2:
Wieso nimmst du eigentlich nicht die schon WICHTIG eingestuften Themen am anfang des Forums ?

Schreibfehler, andere offensichtliche Fehler in der PB-Hilfe
Diskussionen und Anderes rund um die PB-Hilfe
Hinweise + Vorschläge f. bessere Befehls-Beschreibungen etc.

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 22:23
von GPI
Der Wiki-Pedia-Text geht zu sehr ins Detail. Ich gerade bei einer Basic-Programmiersprache davon aus, das Anfänger damit arbeiten. Die Problematik kann man einfach schön mit der "Debug 1000.11-1000.4" darstellen.

Ok, das mit den Struckturen und den geschweiften Klammern hab ich überlesen. Wäre aber eine gute Idee, beim Beispiel ein Link auf die Typen zu setzen. In ersten Moment sieht das wie ein Fehler aus.

Den Sticky hab ich auch übersehen *pfeif*

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 22:36
von TomS
GPI hat geschrieben:Achtung!
Die Steuerwörter Gosub, Return und Goto sind primär aus Kompatiblitätsgrunden enthalten. In 99% aller Fälle sollte man diese Aufrufe vermeiden und Prozeduren benutzen, da Gosub kein struckturierten und sauberen Quellcode ermöglichen.
Bitte?
Nicht dass ich Goto etc benutzen würde, aber was du da sagst ist falsch.

Code: Alles auswählen

bla = 1
gosub function
debug bla ;2

function:
bla + 1
return
Und

Code: Alles auswählen

Declare function()
Global bla = 1
function()
debug bla ;2

Procedure function()
bla+1
EndProcedure
nehmen sich nichts. Der code ist genauso sauber und strukturiert. Wenn mich nicht alles täuscht müsste der ASM-Code sogar ziemlich ähnlich sein.

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 22:45
von GPI
Frag mal jeden Profiprogrammierer, was er über GOSUB denkt. Kann mir nicht vorstellen, das auch einer das als irgendeine Option ansieht. Du hast keinen eigenen Variablennamensraum bspw. Parameterübergabe geht überhaupt nicht. Prozeduren ersetzt den Befehl, ist deutlich Flexibler und dank eigenen Variablennamenraum deutlich weniger fehleranfälliger.

Es ist einfach ein schlechter Programmierstiel das zu benutzen.

Den Goto-Befehl gibt es übrigens in C auch. Begründung: Es könnte theoretisch mal praktisch sein, sowas zu haben - auch wenn den Entwicklern nicht ein Beispiel eingefallen ist. Ich behaupte mal, das es so gut wie kein C Programm gibt, das Goto benutzt.

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 22:54
von TomS
Wenn man zu doof ist, es zu benutzen...
Bei PB 3.94 oder eine davor waren alle Variablen noch global. Man musste sich also trotz Prodezuren eigene Namesräume schaffen mit NameSpace_Var z.B.
Ich habe dir widersprochen, weil du sagtest, dass es nicht möglich ist, strukturierten Code zu schreiben.
Programmierstil hat damit nichts zu tun. Sosnt hieße es ja nicht Stil sondern Vorschrift.
Und Leute die von älteren Basic-Versionen umsteigen, wo es keine Funktionen und Prozeduren gab, werden sicher froh sein, wenn sie weiterhin Goto zur Verfügung haben, ohne den Hinweis, dass sie keinen strukturierten Code fabrizieren können.

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 23:13
von GPI
Ich bin von C64-Basic (dürfte wohl eine reine Basic-Umsetzung sein) auf Omikron-Basic auf den ST umgestiegen. Zwei sachen die ich sofort geliebt habe: Keine Zeilennummern, lange Variablennamen und Prozeduren. Ich hab anschließend nie wieder Gosub benutzt.

Und du irrst dich. 3.93 waren bereits die Variablen in Prozeduren lokal. eben getestet. Ich weis nicht mehr genau, bei welcher Version ich eingestiegen bin, kann mich aber nie errinnern, das Variablen in Prozeduren jemals automatisch global waren, außer man hat sie extra so definiert.

Einen struckturierten, übersichtlichen Code halte ich mit gosub weiterhin nicht für möglich. Du hast ein kleines Beispiel gebracht. Ja da funktionierts. Programmier aber mal ein Programm mit mehreren tausenden Zeilen (mein Rekord liegt bei 26.000 Zeilen) - da wirst du mit Gosub schnell Probleme erhalten.

Prozeduren ersetzen gosub vollständig. Ich kann mir keinen Fall vorstellen, wo man Gosub nehmen sollte, weil es mit Prozeduren nicht geht. Es sind schlicht und ergreifend veraltete Steuerwörter. Ein historisches Überbleibsel.

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 23:38
von STARGÅTE
GPI hat geschrieben:Du hast keinen eigenen Variablennamensraum bspw. Parameterübergabe geht überhaupt nicht.
Und genau dann wenn ich den selben Raum nutzen will, und kein Parameter übergeben will, nutze ich GOSUB !
Klar kann mach auch n Prozedure nutzen mit Global, Shared usw. , aber das ist in meinen Augen "zu viel" für n kleinen SubCode der keinerlei Export-Eigenschaften haben soll.

Inzwischen wurden meine Gosub jedoch fast überall durch Macros ersetzt.
Diese umfassen ja die Vorteile von beidem.

Ein Beispiel für meine GOSUBs kann ich dir nicht liefern, weil sie halt bei mir in großen Projekten stehen und ich sie schlecht aus dem Umfeld nehmen kann :wink:
Nochmals: Gosub ist nicht Besser als Prozeduren und ich bevorzuge es auch nicht, trotzdem tue ich Gosub nicht verdammen!

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Verfasst: 12.09.2010 23:58
von ts-soft
Unterprogramme mit Gosub kann man nicht strukturieren. Die stehen als Spagetti Code am Ende,
wobei man dann ein End im Code braucht oder wird anders übersprungen.

Es gibt nicht einen Vorteil mit Gosub aber viele Nachteile, warum also sollte man das benutzen?

Ein Goto innerhalb eines Variablenraumes zur Fehlerbehandlung ist da schon eher zu akzeptieren.

Gruß
Thomas