Aus Zahl nächsthöhere "glatte" Zahl errechnen
-
Ok, komischer Betreff das gebe ich zu
Aber es ist auch schwer zu erklären.
Folgendes Problem:
Ich habe ein Linien-Diagramm (so ne Zick-Zack Linie halt) das auf der Y-Achse den Kontostand abbildet und auf der X-Achse die Zeit.
Nun habe ich folgende Werte:
Kleinster Kontostand
Grösster Kontostand
Diese Werte brauche ich um die Y-Achse zu initialisieren. Damit das ganze gut aussieht will ich "glatte" Werte haben.
Also anstatt
Kleinster Kontostand = -5164
will ich
Kleinster Kontostand = -5200bzw
Grösster = 10547
als
Grösster = 11000Wie errechne ich jetzt diese Werte ?
Finde keine Lösung
-
Maxwert sei max
scale_max = ceil(max / 10^(anzahl_stellen(abs(max)) - 2)) * 10^(anzahl_stellen(abs(max))) * sign(max)
abs(-5164) = 5164
4 Stellen
10^(4-2) = 10^2 = 100
5164 / 100 = 51,64
ceil(51,64) = 52
52 * 100 = 5200
5200 * sign(max) = 5200 * (-1) = -5200Für den Kleinstwert analog, nur mit floor statt ceil.
Mußt halt beachten, daß dies nur für Zahlen mit >= 2 Stellen funktioniert... und nicht für Kommazahlen wie max = 0.153 und min = 0.092
Ein anderes gängiges Verfahren ist, daß man einfach mit 1.10 multipliziert (also 10% drauf).
Autoskalierung ist ein relativ verzwicktes Thema und gar nicht so trivial wie es aussieht, vor allem je nach dargestelltem physikalischem Bezug sind andere Vorgehensweisen sinnvoll.
-
Man sucht sich als erstes die Gemeinsamkeiten in der Konvertierung. So kann man feststellen, dass bei 4 Stellen die 2 letzten auf 0 gesetzt werden, bei 5 dann 3.
Du zählst also die Anzahl der Stellen, machst eine FP-Division durch 10^(Stellen-2), rundest mit der altbekannten round-Funktion und multiplizierst dann mit 10^(Stellen-2).
-
thx Leute
Ich verstehe zwar den Lösungsweg nicht, aber ich werds mal ausprobieren
-
Es sieht so aus als hieße "glatt" bei dir sowas wie restlos durch 100 teilbar.
Mein Vorschlag wäre also, den Kontostand so lange zu inkrementieren bzw. dekrementieren bis Kontostand%100==0.int kontostand=?; while(kontostand%100!=0) { ++kontostand; }
Das lässt sich natürlich auch noch verbessern (laufzeitmäßig).
-
warum schlaegst du dann sowas bloedes ueberhaupt vor? man koennte auch einen zufallszahlengenerator anwerfen und immer kucken, ob die zahl gut ist.
-
Was isn mit dir los !?
Mein Vorschlag geht über höchstens 99 Iterationen, das ist für den PC doch ein Witz.
-
Original erstellt von <Hendrik>:
Was isn mit dir los !?
Mein Vorschlag geht über höchstens 99 Iterationen, das ist für den PC doch ein Witz.vielleicht, weil while(kontostand%100!=0)++kontostand; nix anderes macht, als kontostand=(kontostand+99)%100;.
-
vielleicht, weil while(kontostand%100!=0)++kontostand; nix anderes macht, als kontostand=(kontostand+99)%100;.[/QB][/QUOTE]
Wieso das denn ?
Wenn ich bei mir 5164 als Ausgangswert nehme kommt 5200 raus.
Bei dir kommt 63 raus.Also entweder steh ich voll aufm Schaluch, oder du liegst falsch.
-
beachte die beiden kringel um das /.
-
@volkard
Wollen wir mal die Formel berichtigen:
kontostand+=100-kontostand%100;Berichtigt: Ich hatte kotostand geschrieben
[ Dieser Beitrag wurde am 10.07.2003 um 09:23 Uhr von RenéG editiert. ]
-
Original erstellt von <Hendrik>:
**Es sieht so aus als hieße "glatt" bei dir sowas wie restlos durch 100 teilbar.
Mein Vorschlag wäre also, den Kontostand so lange zu inkrementieren bzw. dekrementieren bis Kontostand%100==0.int kontostand=?; while(kontostand%100!=0) { ++kontostand; }
Das lässt sich natürlich auch noch verbessern (laufzeitmäßig).**
Ganz so dumm ist der Code doch gar nicht nur die iteration kann man sich sparen.
int kontostand=53424; kontstand = (kontostand + 100- (abs(kontostand)%100)) * sign(kontostand); 53500 = (53424 + 100 - 48) * 1;
-
Original erstellt von RenéG:
**@volkard
Wollen wir mal die Formel berichtigen:
kontostand+=100-kontostand%100;
**ja, ungefähr den code meinte ich. war doch klar zu erkennen, gell?
-
Original erstellt von RenéG:
@volkard
Wollen wir mal die Formel berichtigen:
kontostand+=100-kontostand%100;Das erhöht aber Zahlen, die schon "glatt" sind, um 100
if( int mod = kontostand % 100 ) kontostand += 100 - mod;
-
@MFK
Klaro, aber warum soviele Postings zu dem Thema, obwohl die Frage war, wie man das für 'alle' Zahlen macht, und nicht nur für alle vierstelligen Zahlen.
-
Original erstellt von MFK:
[quote]Original erstellt von RenéG:
[qb]@volkard
Wollen wir mal die Formel berichtigen:
kontostand+=100-kontostand%100;Das erhöht aber Zahlen, die schon "glatt" sind, um 100
QUOTE]Genau das ist nämlich das Problem bei Volkards Formel. Man könnte höchstens vorher prüfen ob "glatt"==true.
Danke für deinen Beistand
Ich muss gestehen, dass ich deine Formel auch nicht ganz verstehe.
(53424+100-48)*1 ist bei mir 53476
-
Original erstellt von <Hendrik>:
Danke für deinen Beistand
Ich muss gestehen, dass ich deine Formel auch nicht ganz verstehe.
(53424+100-48)*1 ist bei mir 53476 :([/QB]Tja, war wohl ein Zahlendreher beim übertragen man sollte seine Beispiele auch noch mal nachrechnen.