Schrift
[thread]1368[/thread]

Zahlensystem, Kovertierungsregeln?

Leser: 2


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
SirLant
 2003-09-24 00:03
#22908 #22908
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Gibt es eine einheitliche Regel nach der ich eine Zahl X zur Basis Y
in das System mit der Basis Z umwandeln kann?

Bei Dual -> Dezimal muss ich ja immer durch 2 teilen und mit dem
Rest arbeiten, gleiches gilt für Hexadezimal zu Dezimal.
Von Dezimal zu Dual muss ich mit Ziffer * Basis^Stelle (Bei null beginnend) umwandeln, gleiches gilt für Hexadezimal.
Bei Oktal dürft dies ebenfalls zutreffen.

Gibt es da eine einheitliche Regel, nach der ich eine Umwandlung
egal aus welchem System in das Zielsystem vornehmen kann?
Dual zu Hexadezimal, mach ich indem ich immer eine Tetrate
nach der anderen in Hex umwandle (ist afaik das schnellste).
Aber wir würde hier die Regel mit den Potenzen/Modulo-Divisionen
wie oben aussehn, genauso?

Überlege da heute schon den ganzen Tag wie eine allgemeingültige
Regel lauten könnte, aber kam bisher noch nicht darauf.
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
jan10001
 2003-09-24 00:40
#22909 #22909
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Mein Tip an dich "Algorithmen mit Perl" von O'Reilly.

Code: (dl )
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
# base($number, $inbase, $outbase) transforms a number from one
# base to another.
#
# Examples:
# base(17, 9, 2) converts 17 (base 9) to base 2: 10000.
# base("fff", 16, 3) converts fff (base 16) to base 3: 12121200.
# base("g", 17, 10) converts g (base 17) to base 10: 16.
#
# Uses the logbase() function defined below.
#
# Returns undef on error.
#
sub base {
my ($number, $inbase, $outbase) = @_;
my ($realnum, $output, $i, $digit);

# Convert the number (which might have letters) to lowercase.
$number = lc($number);

# Return undef (or an empty list) if the base is too weird.
return if $inbase > 36 or $outbase > 36 or
$inbase < 2 or $outbase < 2;

# Convert $number from base $inbase to base 10.
for $digit (reverse split(//, $number)) {
$digit = ord($digit) - 87 if ord($digit) > 96;
return if $digit >= $inbase;
$realnum += $digit * ($inbase ** $i++);
}

# Convert the number from base 10 to $outbase.
# logbase() is defined below.
for ($i = int(logbase($realnum, $outbase)); $i >= 0; $i--) {
$digit = int($realnum / ($outbase ** $i));
$realnum -= $digit * ($outbase ** $i);
$digit = ord($digit + 49) if ord($digit) > 57;
$output .= $digit;
}

return $output;
}

# base(17, 9, 2) converts 17 (base 9) to base 2: 10000.
print base(17, 9, 2), "\n";
# base("fff", 16, 3) converts fff (base 16) to base 3: 12121200.
print base("fff", 16, 3), "\n";
# base("g", 17, 10) converts g (base 17) to base 10: 16.
print base("g", 17, 10), "\n";


# logbase($number, $base) computes the logarithm of number in base $base.
#
# Example: logbase(243, 3) is 5, because 3 ** 5 is 243.
#
sub logbase {
my ($number, $base) = @_;
return if $number <= 0 or $base <= 0 or $base == 1;
return log($number) / log($base);
}
ronald
 2003-09-24 16:51
#22910 #22910
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Das, was wir als Zahl schreiben ist eine abgekürzte Schreibweise.

Beispiel:

103 im 10er-System ist 1*10^2 + 0*10^1 + 3*10^0

Wenn man diese Zahl jetzt z.B. ins 8er-System unrechnen will, dann muss man entsprechende Faktoren bestimmen, so dass die Gleichung mit der Basis 8 passt.

Da 8^0=1, 8^1=8, 8^2=64, 8^3=512 ist ergibt sich:
103 = 1*64 + 39 = 1*64 + 4*8 + 7 = 1*8^2 + 4*8^1 + 7*8^0

Somit gilt: 103 im 10er-System entspricht 147 im 8er-System.
Manche schreiben auch 103(10) = 147(8).

Übrigens kann man als Basis nicht nur 1, 2, 8, 10 oder 16 nehmen. Ich finde z.B. negative Basen genial, weil dann macht das Vorzeichen nicht so viel Ärger.
Es sind sogar Brüche oder reelle Zahlen als Basis möglich. Die Umrechung zwischen diesen Basen wäre aber ein Thema für eine Diplom- oder Doktorarbeit in Mathematik.

Über komplexe Zahlen habe ich mir noch keine Gedanken gemacht...

Nur die Basis 0 ist nicht zu empfehlen. Die Begründung dafür bleibt dem interessierten Leser überlassen. :p
betterworld
 2003-09-24 17:57
#22911 #22911
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=ronald,24.09.2003, 14:51]Die Umrechung zwischen diesen Basen wäre aber ein Thema für eine Diplom- oder Doktorarbeit in Mathematik.[/quote]
Das finde ich nun aber doch etwas uebertrieben.

Vor nicht all zu langer Zeit wurde uebrigens ein Verfahren zur Berechnung von PI (oder auch von 'e', was sogar noch viel einfacher geht) gefunden, was auf einer sehr alternativen Idee aufbaut. Man kann PI relative einfach darstellen -- aber nicht etwa in der Darstellung zur Basis (1, 1/10, 1/100,...) oder (1, 1/2, 1/4,...), sondern (1, 1/3, 1/5, 1/7,...). Das Problem besteht nur noch darin, eine Umrechnungsmethode von dieser Basis in die Zehnerbasis zu finden.
SirLant
 2003-09-24 19:49
#22912 #22912
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Das Grundprinzip einer Konvertierung von der Basis ist mir eigentlich
schon klar, aber was ich nicht verstehe, wieso teile ich das
eine mal (2er,16er in 10er) und das andere mal nehme ich
Potenzen?


Als allgemeine Sache habe ich bisher folgendes:
Ausgangszahl[Ziffer1,Ziffer2,Ziffer3] =
Ziffer3 + Zielbasis^(StelleDerZiffer-1) +
Ziffer2 + Zielbasis^(StelleDerZiffer-1) +
Ziffer1 + Zielbasis^(StelleDerZiffer-1) = ZahlInZielbasis

Dies Funktioniert von 10 in 2,8,16 ,aber wie sieht es in andere Systeme aus?
Und wieso muss ich von 2,8,16 in die 10 mit Modulo-Division arbeiten?

Hoffe ihr könnt mir da ein wenig helfen.

@Jan dein Skript schau ich mir heute Abend einmal an, vllt.
ist es sogar DIE Lösung.Aber ich muss gleich wieder los
(heute nur Unterwegs, von 7.40-17.00 Schule, 30min nach
Hause gefahren und in 10min noch zur Fahrschule)\n\n

<!--EDIT|SirLant|1064419870-->
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
SirLant
 2003-09-25 15:24
#22913 #22913
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
*Erinnert euch mal wieder an den Thread* :laugh:

Habe mir das Skript nun einmal angeschaut, aber es hat mir
nur indirekt weitergeholfen, es wir dort mit dieser Potenzregel
gearbeitet, so wie ich es in meinem Posting über diesem ja auch
dargestellt habe.
Aber wieso wird dort irgendetwas in Basis10 konvertiert (laut
den Kommentaren)?

Und kann mir wer die Fragen aus dem Posting darüber, kurz
beantworten?


Vielen Dank
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
ronald
 2003-09-25 15:59
#22914 #22914
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Hallo,

Deine Formel
Code: (dl )
1
2
3
4
Ausgangszahl[Ziffer1,Ziffer2,Ziffer3] = 
Ziffer3 + Zielbasis^(StelleDerZiffer-1) +
Ziffer2 + Zielbasis^(StelleDerZiffer-1) +
Ziffer1 + Zielbasis^(StelleDerZiffer-1) = ZahlInZielbasis

ist so nicht richtig.

1. muss es
Code: (dl )
1
2
3
4
Ausgangszahl[Ziffer1,Ziffer2,Ziffer3] = 
Ziffer3 * Zielbasis^(StelleDerZiffer-1) +
Ziffer2 * Zielbasis^(StelleDerZiffer-1) +
Ziffer1 * Zielbasis^(StelleDerZiffer-1) = ZahlInZielbasis

heissen :)

und zweitens würde ich
Code: (dl )
1
2
3
4
Ausgangszahl[Ziffer1,Ziffer2,Ziffer3] = 
Ziffer1 * Zielbasis^(AnzahlDerZiffern-StelleDerZiffer) +
Ziffer2 * Zielbasis^(AnzahlDerZiffern-StelleDerZiffer) +
Ziffer3 * Zielbasis^(AnzahlDerZiffern-StelleDerZiffer) = ZahlInZielbasis

schreiben :) :)

Drittens ist das Ergebnis nicht vom Zahlensystem abhängig, sondern nur die Darstellung.
Somit ergibt sich:
Code: (dl )
1
2
3
4
Wert(Ausgangsbasis,Ziffer1,Ziffer2,Ziffer3) = 
Ziffer1 * Ausgangsbasis^(AnzahlDerZiffern-StelleDerZiffer) +
Ziffer2 * Ausgangsbasis^(AnzahlDerZiffern-StelleDerZiffer) +
Ziffer3 * Ausgangsbasis^(AnzahlDerZiffern-StelleDerZiffer)

:) :) :)

Beispiel:
Code: (dl )
1
2
3
4
5
6
7
Wert(16, F, E) =  /* F=15, E=14 */
15 * 16^(2-1) +
14 * 16^(2-2)
= 15 * 16^1 + 14 * 16^0
= 15*16 + 14*1 = 254
Was so viel bedeutet wie:
X"FE" = 254


HTH, und frustriert nicht zu arg.
SirLant
 2003-09-25 22:41
#22915 #22915
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Danke, mit der Formel von mir hast du natürlich recht, ist
mir Gestern Abend wohl ausversehen passiert.
Aber eine Frage zur Darstellung, wenn ich das Ergebnis ebenfalls
frei wählbar wie die Ausgangsbasis haben möchte, wie soll
ich das dann anstellen?
Jetzt verstehe ich auch, weshalb in dem Skript von oben,
in 10 umgewandelt wird und wieder zurück, aber da gibts
doch sicher noch ne andere(effektivere) Methode, oder?


Ich werde vorerst mal die Methode über die 10er Basis nehmen und
dann überlegen Wir uns einmal eine bessere Methode, die sollte
von Basis 2-36 gehen.

Bin gerade am überlegen, ob es so viel mehr bringt, wenn man
das Ergebnis direkt in das Zielsystem bringt, weil Rechnen muss
ich da ja ebenfalls.\n\n

<!--EDIT|SirLant|1064520632-->
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Crian
 2003-10-21 15:03
#22916 #22916
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=ronald,24.09.2003, 14:51]Übrigens kann man als Basis nicht nur 1, 2, 8, 10 oder 16 nehmen. Ich finde z.B. negative Basen genial, weil dann macht das Vorzeichen nicht so viel Ärger.
Es sind sogar Brüche oder reelle Zahlen als Basis möglich. Die Umrechung zwischen diesen Basen wäre aber ein Thema für eine Diplom- oder Doktorarbeit in Mathematik.[/quote]
Mist - hätte ich das geahnt, hätte ich doch noch schnell meinen Doktor nach dem Diplom gemacht ;-)) ^^
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
betterworld
 2003-10-21 16:17
#22917 #22917
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Was hast Du denn fuer ein Diplom?
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2003-09-24 00:03.