Seite 1 von 1

Frage zu Division mit Rest. Wenn Rest <> 0, dann Ergebnis +1

Verfasst: 27.01.2018 14:06
von Kurzer
Hallo,

ich möchte eine Division durchführen und wenn der Rest der Division <> 0 ist, soll auf das Ergebnis 1 addiert werden. Das möglichst als Einzeiler.

Derzeit löse ich das so:

Ergebnis = a / b + Bool(a % b > 0)

Gibt es eine mathematisch elegantere Lösung, so dass man kein Bool() nutzen muss oder ist das schon die eleganteste Methode?

Code: Alles auswählen

#Aepfel = 70
#AepfelProKiste = 12

; Ergebnis = a / b + Bool(a % b > 0)

Debug "Es passen " + Str(#AepfelProKiste) + " Äpfel in eine Kiste."
Debug "Für die Unterbringung von " + Str(#Aepfel) + " Äpfel benötigt man" + Str(#Aepfel / #AepfelProKiste + Bool(#Aepfel % #AepfelProKiste > 0)) + " Kisten"
Debug "weil in " + Str(#Aepfel / #AepfelProKiste) + " Kisten nur " + Str((#Aepfel / #AepfelProKiste) * #AepfelProKiste) + " Äpfel passen."

Re: Frage zu Division mit Rest. Wenn Rest <> 0, dann Ergebni

Verfasst: 27.01.2018 14:45
von _JON_
Wo ist das Problem mit Bool()?
Wenn es unbedingt ein 1-Zeiler sein soll:

Ergebnis = a / b : If (a % b) : Ergebnis + 1 : EndIf

:bounce:

Re: Frage zu Division mit Rest. Wenn Rest <> 0, dann Ergebni

Verfasst: 27.01.2018 19:06
von STARGÅTE
Ergebnis = a / b + Sign(Mod(a, b))

Re: Frage zu Division mit Rest. Wenn Rest <> 0, dann Ergebni

Verfasst: 27.01.2018 20:57
von mk-soft
Für Ganzzahlen

Code: Alles auswählen

Define a.i, b.i, c.i

a = 70
b = 12
c = a / b + Bool(a % b)
Debug c

a = 10
b = 3
c = a / b + Bool(a % b)
Debug c
Bool ist schon ok...

Re: Frage zu Division mit Rest. Wenn Rest <> 0, dann Ergebni

Verfasst: 27.01.2018 21:00
von Kurzer
Ah, Sign() ja genau das scheint mir das passendere zu sein. Danke Stargate.

@_Jon_: Ich habe mit Bool() solange kein Problem, solange #True in PureBasic als 1 definiert ist. Da ich nicht weiß, ob Fred das zusichert, wollte ich eine Version finden, die diesbezüglich "zukunftssicherer" ist (auch wenn es nicht sehr wahrscheinlich ist, dass die Konstante #True mal einen anderen Wert bekommen wird).

Also, vielen Dank euch beiden.

Edit: mk-soft, auch dir Danke für den Beitrag. Ich nutze aus o.g. Grund jetzt die Sign() Variante.

Re: Frage zu Division mit Rest. Wenn Rest <> 0, dann Ergebni

Verfasst: 27.01.2018 21:59
von Josh
Kurzer hat geschrieben:Ich habe mit Bool() solange kein Problem, solange #True in PureBasic als 1 definiert ist. Da ich nicht weiß, ob Fred das zusichert, wollte ich eine Version finden, die diesbezüglich "zukunftssicherer" ist .
#True wird nie einen anderen Wert bekommen !!!
1) Weil es keinen Grund dafür gibt
2) Weil sonst 99,99% der Pb-Programme nicht mehr funktionieren würden.

Re: Frage zu Division mit Rest. Wenn Rest <> 0, dann Ergebni

Verfasst: 28.01.2018 11:33
von CSHW89
Auch wenn es quasi schon gelöst ist, ist das mathematisch gesehen nicht einfach ein Aufrunden auf die nächst größere Zahl?

Code: Alles auswählen

c = Round(1. * a / b, #PB_Round_Up)

Re: Frage zu Division mit Rest. Wenn Rest <> 0, dann Ergebni

Verfasst: 28.01.2018 11:47
von Kurzer
CSHW89 hat geschrieben:Auch wenn es quasi schon gelöst ist, ist das mathematisch gesehen nicht einfach ein Aufrunden auf die nächst größere Zahl?

Code: Alles auswählen

c = Round(1. * a / b, #PB_Round_Up)
Haha, in der Tat. :D Jetzt weiß ich woher der Spruch "den Wald vor lauter Bäumen nicht sehen" kommt.
Manches kann so einfach sein.

Vielen Dank, CSHW89.

PS: Round verarbeitet auch Doubles, das "1. *" ist daher nicht nötig (produziert bei mir auch einen Syntax error).