[Handbuch] Allgemeine Themen, Typen und Operatoren

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

[Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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*
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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!
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: [Handbuch] Allgemeine Themen, Typen und Operatoren

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten