AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Aufrunden einer Zahl auf nächstes Vielfaches
Thema durchsuchen
Ansicht
Themen-Optionen

Aufrunden einer Zahl auf nächstes Vielfaches

Ein Thema von Valle · begonnen am 19. Aug 2011 · letzter Beitrag vom 20. Aug 2011
Antwort Antwort
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#1

Aufrunden einer Zahl auf nächstes Vielfaches

  Alt 19. Aug 2011, 21:11
Hallo DPler!

Ich stehe im Moment leider mathematisch etwas auf dem Schlauch. Ziel ist es, eine ganze Zahl auf das nächste Vielfache von m aufzurunden.
Hier unterscheidet sich die Aufgabe in zwei Situationen:

(1) m ist bereits beim Programmieren bekannt und entspricht einer Zweierpotenz, in meinem Fall 2^12, also 4096.
(2) m ist eine beliebige, unbekanntem ganze Zahl

Hier ein kleiner Demonstrations-Code, der in beiden Fällen tut was er soll, allerdings sehr unschön.

Code:
while zahl % m != 0:
    zahl = zahl + 1
Ich würde mich freuen, wenn ihr mir helfen könntet, die Zahl korrekt aufzurunden. Für die zwei unterschiedlichen Fälle sind auch zwei unterschiedliche Vorgänge in Ordnung, es interessiert mich hier lediglich, wie man in beiden Fällen am besten Vorgehen kann. Bei (1) lässt sich möglicherweise besser mit Bitschupserei arbeiten.

Das Ganze muss unabhängig von jeder Sprache und Bibliothek funktionieren, also kein ceil() o.ä.

Vielen Dank für eure Hilfe!

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#2

AW: Aufrunden einer Zahl auf nächstes Vielfaches

  Alt 19. Aug 2011, 21:31
Das Ganze muss unabhängig von jeder Sprache und Bibliothek funktionieren, also kein ceil() o.ä.
Du bist lustig

Für den allgemeinen Fall: Die Signumsfunktion kann man sich Bit-Arithmetisch bauen (siehe z.B.: http://bits.stephan-brumme.com/sign.html, oder noch einfacher mit if-else). Wenn meine Erkältung also mein Hirn grade nicht zu sehr außer Funktion setzt sollte sich das ganze doch in etwa so Lösen lassen:
Code:
x = Zahl
m = Vielfaches, auf das x gerundet werden soll

f = x div m (oder darf man auch keine Integer-Division voraussetzen? Kann man aber zur Not ja mit Modulo bauen...)
fa = sgn(x mod m)
result = (f + fa) * m

Geändert von Meflin (19. Aug 2011 um 21:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Aufrunden einer Zahl auf nächstes Vielfaches

  Alt 19. Aug 2011, 23:48
Auf 2^12 aufrunden (mit Bitschubserei):
Code:
BIT12 = 1 << 12
MASK11 = BIT12 - 1; // Bitmaske unterste 11 Bits
if (MASK11 & eingabe != 0) {
  ergebnis = (eingabe & ~MASK11) + BIT12;
} else {
  ergebnis = eingabe;
}
Mit der von Melfin genannten Signum-Funktion würde es so gehen:
Code:
BIT12 = 1 << 12
MASK11 = BIT12 - 1;
ergebnis = (eingabe & ~MASK11) + (sgn(eingabe & ~MASK11)) << 12;
Das geht beides allerdings nur mit positiven Zahlen gut.

EDIT: Das musste jetzt einfach sein
Delphi-Quellcode:
{$ASMMODE intel}
function roundUp4096(x: longword): longword; pascal;
const
  mask11: longword = (1 shl 12) - 1;
  not_mask11: longword = not ((1 shl 12) - 1);
begin
  asm
    mov edx, eax // eax = edx = x
    and eax, not_mask11
    xor ecx, ecx // clear ecx
    and edx, mask11
    setnz cl // cl = 1 if not zeroflag else 0
    shl ecx, 12
    add eax, ecx
  end;
end;
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (20. Aug 2011 um 00:59 Uhr)
  Mit Zitat antworten Zitat
bit4bit

Registriert seit: 14. Jun 2006
Ort: Köln
25 Beiträge
 
#4

AW: Aufrunden einer Zahl auf nächstes Vielfaches

  Alt 20. Aug 2011, 02:33
@valle

... also Dein
Delphi-Quellcode:
while zahl % m != 0:
    zahl = zahl + 1
ist äquivalent zu
Delphi-Quellcode:
zahl, m: integer;
zahl := ((zahl + m-1) div m ) * m;
oder hab ich was falsch verstanden ?

Wenn es zeitkritisch ist kann man daran noch einiges optimieren
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#5

AW: Aufrunden einer Zahl auf nächstes Vielfaches

  Alt 20. Aug 2011, 11:35
Hallo,

vielen Dank für eure Antworten!

Jetzt wenn man weiß wie's geht, ist die Sache doch eigentlich ganz einfach.

@Meflin: Die Sache muss unabhängig sein, da der Code Teil eines Betriebssystem-Kernels ist.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz