LN(logaritmus)

hey @ all
also mein problem:
ich will einfach die anzahl der stellen von dezimal in dual
bsp.
dezimalzahl =11

umwandlung in die stellen

2^n =11 /log
log 2^n =log 11
n log 2 = log 11 / :log2
n=log11:log2
n = 3,45 runden 4
n=4

also ist die anzahl der stellen in einer dualzahl = 4

wie kann ich das mit der function Ln(const X: Extended): Extended; machen?
bitte um hilfe.

MFG
Tobi

Hallo,

es gilt:

Loga(x) / Loga(b) = Logb(x)

also ist auch

Loge(x) / Loge(b) = Logb(x)

bzw.

Ln(x) / Ln(b) = Logb(x)

Du willst haben:

Log2(x)

was das gleiche ist wie

Ln(x) / Ln(2)

Das solltest du hinbekommen. Das Ergebnis musst du noch (auf-)runden, klar.

LG
Jochen

hey
function Ln(X: Extended): Extended;

begin
Ln(x) / Ln(2):=x
end;
[Fehler] Unit2.pas(219): E2064 Der linken Seite kann nichts zugewiesen werden
was da los?
ich möchte die dezimalzahl aus edit1 nehmen.

habs ma so probiert

procedure TForm2.Button7Click(Sender: TObject);
var a,x:extended;
b:string;
begin
a:=Ln(11) / Ln(2);
a:=strtofloat(b);
edit6.Text:=b;

aber im edit6.text kommt nix

juhu ich hab´s
vielen dank

var a,x:extended;
b,c:string;
begin
c:=edit1.text;
x:=strtofloat©;
a:=Ln(x) / Ln(2);
b:=floattostr(a);
edit6.text:=b;

Und alles zusammen:

Edit6.Text := FloatToStr( Ln(StrToFloat(Edit1.Text)) / Ln(2) )

Ach ja, ggf solltest du entweder mit der Funktion Val() oder mit Try-Except-Blöcken prüfen, ob Edit1.Text in eine valide positive Zahl umgewandelt werden kann (falls der User Müll eingibt).

Das könnte so aussehen:

**var**
 x: Extended;
 msg: String;
**begin**
 msg := '';
**if** Edit1.Text = '' **then** 
 msg := 'Es ist nichts eingegeben'
**else  
 try**  
 x := StrToFloat(Edit1.Text);
 if x except
 msg := 'Die Eingabe ist keine (gültige) Zahl'
**end** ;
**if** msg = '' **then**
 Edit6.Text := FloatToStr( Ln(x) / Ln(2) )
**else**
 ShowMessage(msg);
**end** ;

LG
Jochen

Wenn du einfach wissen willst, wieviele „Binärstellen“ eine beliebige Dezimalzahl n hat (ich geh mal von Ganzzahlen aus), könntest Du in einer schleife n div 2 durchführen, bis das Ergebnis 0 ist. vor jedem Durchgang machst Du inc(b) (das Du vorher mit 0 initialisiert hast) und hast am Schluß in b die Anzahl Stellen im Dualsystem stehen.
Das hat den Vorteil, daß Du nicht mit Logarhithmen und Extended Gleitpunkt Zahlen hantieren mußt, die viel Rechenleisung brauchen sondern nur mit integern und daß Du bei n=0 das korrekte ergebnis b=1 bekommst (0 braucht auch eine Stelle).

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]