Autor Beitrag
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Di 27.07.10 09:22 
Da müsste man den gesammten Code sehen. Die 0 kommt raus, weil entweder value 0 ist oder value * ergebnis zu klein ist, was aber bei dem Code den ich gepostet habe nicht passieren sollte. Leider weiß ich nicht, was du davor machst.
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Di 27.07.10 10:24 
ja das mit der 0 hatte ich jetzt auch schon herausgefunden
davor mach ich nur:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
         unit = "V";
            string prefix = "";
            double devisor = 1;
            //Prefix
            switch ((int)(value != 0 ? Math.Log10(value) / 3 : 0)) //123456,78/3=1,697 ~1
            {                
                case -5:
                    prefix = "f";
                    devisor = 10e-14;
                    break;
                case -4:
                    prefix = "p";
                    devisor = 10e-11;
                    break;
                case -3:
                    prefix = "n";
                    devisor = 10e-8;
                    break;
                case -2:
                    prefix = "µ";
                    devisor = 10e-5;
                    break;
                case -1:
                    prefix = "m";
                    devisor = 10e-2;
                    break;
                case 1:         //Springt in case 1
                    prefix = "k";
                    devisor = 10e2;
                    break;
                case 2:
                    prefix = "M";
                    devisor = 10e5;
                    break;
                case 3:
                    prefix = "G";
                    devisor = 10e8;
                    break;
                case 4:
                    prefix = "T";
                    devisor = 10e11;
                    break;
                default:
                    prefix = "";
                    devisor = 1;
                    break;
            }
            //Signifikante Stellen
            double ergebnis = Math.Pow(10, -Math.Floor(Math.Log10(value) + significance - 1));


es funktioniert jetzt auch fast, nur beachtet er die signifikanten srtellen eben noch net so wirklich also z.b:
0,000251236V
signifikanz: 3
ausgabe: 0,00025126mV

2512,36V
sig.: 5
ausgabe: 2,51kv

sehr komisch...
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Di 27.07.10 14:20 
ich würde sagen, dann hast du irgendetwas nicht korrekt umgesetzt. Ich habe den Code den ich gepostet habe getestet und er funktioniert einwandfrei^^ Vielleicht sendest du mal deinen kompletten Code, dann kann ich dir auch weiterhelfen. Das gepostete oben ist unvollständig.
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Do 29.07.10 13:38 
also hier noch einmal der ganze quelltext. die ref schlüsselwörter sind zum übergeben der parameter gedacht ;)
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
public string ConvertTo(ref double value, ref int significance, ref string unit, ref bool usePrefix)
        {
            unit = "V";
            string prefix = "";
            double devisor = 1;
            //Prefix
            switch ((int)(value != 0 ? Math.Log10(value) / 3 : 0)) //123456,78/3=1,697 ~1
            {                
                case -5:
                    prefix = "f";
                    devisor = 10e-14;
                    break;
                case -4:
                    prefix = "p";
                    devisor = 10e-11;
                    break;
                case -3:
                    prefix = "n";
                    devisor = 10e-8;
                    break;
                case -2:
                    prefix = "µ";
                    devisor = 10e-5;
                    break;
                case -1:
                    prefix = "m";
                    devisor = 10e-2;
                    break;
                case 1:         //Springt in case 1
                    prefix = "k";
                    devisor = 10e2;
                    break;
                case 2:
                    prefix = "M";
                    devisor = 10e5;
                    break;
                case 3:
                    prefix = "G";
                    devisor = 10e8;
                    break;
                case 4:
                    prefix = "T";
                    devisor = 10e11;
                    break;
                default:
                    prefix = "";
                    devisor = 1;
                    break;
            }
            //Signifikante Stellen
            double ergebnis = Math.Pow(10, -Math.Floor(Math.Log10(value) + significance - 1)); //(123456,78)+4-1= 10e-2 =0,01
            double rvalue = Math.Round(value * ergebnis, 6) / ergebnis; //(123456,78*0,01)/0,01= 123500
          
            if (!usePrefix && devisor < 1)
            {
                //Ergebnis ohne Prefix
            }
            else
            {
                //Ergebnis mit Prefix
            }
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append(rvalue / devisor); //123500/1000=123,5
            sb.Append(prefix); //k
            sb.Append(unit); //V
            return sb.ToString();  //---->123,5kV 
            
        }


mit unsrem beispiel wert 123456,78 sig. 4 funktioniert es übrigens. kommt 123,5kV raus
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Do 29.07.10 18:36 
Das sind aber noch einige Fehler drin...
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Mo 02.08.10 07:47 
user profile iconnorman2306 hat folgendes geschrieben Zum zitierten Posting springen:
Das sind aber noch einige Fehler drin...


und die wären??
mit dem useprefix wewiß ich nicht genau wie und was ich damit anstellen soll und wo eine floor funktion fehlen soll weiß ich auch noch nicht?!
CSMN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43
Erhaltene Danke: 2



BeitragVerfasst: Mo 02.08.10 20:10 
was für ein genialer thread - den drucke ich mir aus und rahm in ein... ^^
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Mi 04.08.10 09:36 
sorry das nicht jeder, als programmierender super nerd auf die welt kommt -.-
so viel zu "C# - Deine freundliche C# und .NET Community"
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 04.08.10 09:43 
@offtopic

Also eigentlich sollte man das euch untereinander austragen lassen, aber ich habe frei und was ist da besser also Morgens zum Kaffee sich an einer Diskussion zu beteiligen (Nerd :o).

CSMN seine Kommentare überlese ich hier im Forum, weil die noch nie besonders geistreich waren.
@Ivy dass du von einem Kommentar die ganze Hilfe die du hier bekommst ins lächerliche ziehst spricht nicht für dich.

Ich wünsche beiden ein bisschen mehr Rückgrad, weil es gibt hier viele die Spaß am Austauch von Informationen und Hilfestellungen haben.

So kommt runter und noch einen schönen Tag,

Gruß

Für diesen Beitrag haben gedankt: Kha
CSMN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43
Erhaltene Danke: 2



BeitragVerfasst: Mi 04.08.10 19:22 
@Ivy das war mehr spaß als ernst :shock: sorry!

@danielf wenn du meine kommentare wegen mangelnder geistreichtigkeit überlesen tust, wie kommt es dann das du drauf reagierst :wink:
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Do 05.08.10 08:38 
user profile iconCSMN hat folgendes geschrieben Zum zitierten Posting springen:
@Ivy das war mehr spaß als ernst :shock: sorry!

@danielf wenn du meine kommentare wegen mangelnder geistreichtigkeit überlesen tust, wie kommt es dann das du drauf reagierst :wink:


er hat wohl eher auf meinen Beitrag reagiert :/

Naja mir wärs recht, wenn wir jetzt wieder zum thema zurück kommen würde...
CSMN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43
Erhaltene Danke: 2



BeitragVerfasst: Do 05.08.10 10:00 
soooo Ivy,

das erste was mir aufgefallen ist, dass du unit an die funktion übergibst und dann gleich wieder überschreibst - das macht nicht wirklich viel sinn (sowas nennt man auch dd-anomalie). das hauptproblem wird aber die switch-anweisung sein bzw. die bedingung die du da reingeschrieben hast. wenn du z.b. 0.0012345 als value übergibst dann sollten ja 1,2345 mV rauskommen. durch die bedingung (int)(value != 0 ? Math.Log10(value) / 3 : 0) wird aber switch(0) ausgeführt und du springst in den default bereich. ich würde dir raten die bedingung auszulagern, d.h. vorher zu berechnen int bedingung =.... und im anschluß dann switch(bedingung){...} zu verwenden. weiter habe ich erstmal nicht geschaut... achso, warum verwendest du das schlüsselwort ref? dass muss dort nicht sein. parameter kannst du einfach mit dem typ übergeben sofern du nicht die originalen werte innerhalb der funktion weiterbearbeiten möchtest. zum beispiel public int GGT(int T1, int T2)...
die grundlagen solltest du mal nen bisschen mit galileo openbooks, oder so nacharbeiten...
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Do 05.08.10 11:40 
ja was bringt es wenn ich die bedinung auslagere, es wird ja trotzdem noch das gleiche berechnet. ergibt für mich keinen sinn^^

ausblenden C#-Quelltext
1:
2:
3:
int bedingung = (int)(value != 0 ? Math.Log10(value) / 3 : 0);

            switch (bedingung)
CSMN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43
Erhaltene Danke: 2



BeitragVerfasst: Do 05.08.10 14:06 
du hast es falsch verstanden! natürlich musst du die bedingung überarbeiten!
ich dachte nur, dass es für dich einfacher wäre dir die bedingung im detail
anzuschauen - was von aussen einfacher ist... nun, roger?
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Do 05.08.10 14:09 
ahja ^^ nur weiß ich nicht was an der bedingung falsch ist und wa sich da ändern soll
CSMN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43
Erhaltene Danke: 2



BeitragVerfasst: Do 05.08.10 14:10 
was soll die bedingung denn machen?
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Do 05.08.10 14:12 
ja ausrechnen in welchen case mein programm springen soll. das mit dem logarthismus versteh ich nich, wie das gerechnet wird.
CSMN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43
Erhaltene Danke: 2



BeitragVerfasst: Do 05.08.10 14:22 
hmmm, wenn du das nicht verstehst, warum schreibst du dir dann nicht ein kleines skript in welchen du dir alle fälle einmal anschaust wie sie aussehen wenn du die operation [Math.Log10(value) / 3] auf den value anwendest? mit fälle meine ich deine unterschiedlichen einheiten von µ bis M. oder du nimmst dein derzeitiges programm und setzt dir an der stelle nen breakpoint, gehst in den debugmodus und ziehst dir die bedingung in den überwachungsbereich - so kannst du auch schauen was passiert und warum die gewünschten cases nicht angesprungen sondern der default angewählt wird. dadurch sollte dir das prinzip eigentlich klar werden.

wenn du jedoch die mathematik dahinter verstehen möchtest, solltest du dir ein mathebuch anschauen.
CSMN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43
Erhaltene Danke: 2



BeitragVerfasst: Do 05.08.10 14:26 
user profile iconnorman2306 hat folgendes geschrieben Zum zitierten Posting springen:

du nimmst den log10 der Zahl, denn

log 0,000001 = -6 := µ
log 0,001 = -3 := m
log 1000 = 3 := k



norman2306 hatte mit den obigen zeilen eigentlich auch schon sehr deutlich das prinzip dargestellt.
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Do 05.08.10 14:31 
debugger hab ich ja schon durch laufen lassen, aber wie die rechnung funktioniert wird mir da auch nicht angezeit, geschweigeden die logik die dahinter steckt.
ja das von norman hab ich ja dann auch so umgesetzt, hab ich ja eig alles so^^