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 = -5200

    bzw
    Grösster = 10547
    als
    Grösster = 11000

    Wie 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) = -5200

    Fü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. 😃

    @JoeIntel

    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>:

    @JoeIntel

    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.


Anmelden zum Antworten