Mathe Funktion zum ebnen gesucht.

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Mathe Funktion zum ebnen gesucht.

Beitrag von Mathias »

Was ist das für eine Funktion, welche folgendes ausspuckt ?

Code: Alles auswählen

1 -> 1
10 -> 2
100 -> 3
1000 -> 4
Bei Statistiken sieht man solches noch viel.
Könne dies etwas mit "log" zusammenhängen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von theo »

So könnte es gehen:

Code: Alles auswählen

  Uses Math;
  Caption:=IntToStr(Trunc(log10(StrToInt(Edit1.text)))+1);   

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 338
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von Niesi »

So kann es auch gehen:

Code: Alles auswählen

Label1.Caption := IntToStr(length(Edit1.Text));
Evtl. muss eine Zahl erst in einen String konvertiert werden ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von wp_xyz »

Die Logarithmen waren eine der wichtigesten Erfindungen der Mathematik der Neuzeit. Und ohne so ein simples mechanisches Ding wie den Rechenschieber, den heute niemand mehr kennt, hätte man in der Vor-Computer-Zeit nie große Zahlen miteinander multiplizieren/dividieren können.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 338
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von Niesi »

wp_xyz hat geschrieben:
Mi 27. Sep 2023, 13:38
Die Logarithmen waren eine der wichtigesten Erfindungen der Mathematik der Neuzeit. Und ohne so ein simples mechanisches Ding wie den Rechenschieber, den heute niemand mehr kennt, hätte man in der Vor-Computer-Zeit nie große Zahlen miteinander multiplizieren/dividieren können.
Es kommt darauf an, was Du als Neuzeit definierst. Logarithmen wurden nachweislich bereits im 2. Jahrhundert in Indien verwendet.

Und die Frage von Mathias habe ich mal so aufgefasst, dass die Anzahl der Stellen ermittelt werden sollte. Das muss nicht unbedingt mit Logarithmen zu tun haben ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von h-elsner »

Ich habe das Rechnen mit dem Rechenschieber noch in der Schule gelernt.
Die Lösung mit dem length(ein_zahlenstring) finde ich am elegantesten. Ich hätte nur zur Sicherheit noch ein trim(ein_zahlenstring) auf den String hinzugefügt.

Ich hatte natürlich wieder die umständlichste Lösung, geht aber auch.

Code: Alles auswählen

function MyLOG10(x: integer): integer;
var
  w: integer;

begin
  result:=0;
  w:=x;
  repeat
    w:=w div 10;
    inc(result);
  until w=0;
end;

function MyLOG10toStr(x: integer): string;
begin
  result:=IntToStr(MyLog10(x));
end;
Gruß HE

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von Mathias »

Und die Frage von Mathias habe ich mal so aufgefasst, dass die Anzahl der Stellen ermittelt werden sollte. Das muss nicht unbedingt mit Logarithmen zu tun haben ...
Ups, da habe ich mich ein bisschen falsch ausgedrückt.

Ich denke mit log10 von theo müsste es gehen.
Muss erst einen Versuch starten und gucken.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von wp_xyz »

Niesi hat geschrieben:
Mi 27. Sep 2023, 14:01
Es kommt darauf an, was Du als Neuzeit definierst. Logarithmen wurden nachweislich bereits im 2. Jahrhundert in Indien verwendet.
Wusste ich nicht... Europa ist halt nicht der Nabel der Welt.

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von Mathias »

Und die Frage von Mathias habe ich mal so aufgefasst, dass die Anzahl der Stellen ermittelt werden sollte. Das muss nicht unbedingt mit Logarithmen zu tun haben ...
Ups, da habe ich mich ein bisschen falsch ausgedrückt.

Ich denke mit log10 von theo müsste es gehen.
Muss erst einen Versuch starten und gucken.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von Mathias »

Ich habe folgendes in den GLSL-Shader meiner Animation eingefügt, und es sieht einiges besser aus als vorher.

Code: Alles auswählen

float log10(float x){
    //log10(x) = log(x) / log(10) = (1 / log(10)) * log(x)
    const float d = 1. / log(10);
    return d * log(x);
}
...
    Height = log10(Height);
Ich bin am versuchen ein Mandelbrot mit tesselation in 3D zu berechnen.
Mit dem log10 sieht es schon einiges besser aus.

Ein gewöhnliches log(x) gibt es in der Unit Math nicht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von Ally »

Hallo Mathias,

sowohl die Lösung von Theo als auch die von Niesi, liefern die selben Ergebnisse.
Die "Length-Lösung" ist aber schon deshalb die Elegantere, weil Math nicht benötigt wird.

Code: Alles auswählen

function IntegerLength(X: Integer): Integer;
begin
  //Für positive Werte reicht das hier:
  Result := Length(X.ToString);
  //Result := Trunc(log10(X)) + 1;

  //Wenn es auch mit negativen Werten funktionieren soll:
  //Result := Length(Abs(X).ToString);
  //Result := Trunc(log10(Abs(X))) + 1;
end;

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von theo »

Ally hat geschrieben:
Mi 27. Sep 2023, 16:03
sowohl die Lösung von Theo als auch die von Niesi, liefern die selben Ergebnisse.
Die "Length-Lösung" ist aber schon deshalb die Elegantere, weil Math nicht benötigt wird.
Kann schon sein, aber Mathias wollte eine Lösung mit "log" haben. Auf "Length" ist er wahrscheinlich auch gekommen.
Die Stringlänge dafür zu nehmen ist schon etwas "straightforward". "Elegant" ist jetzt nicht direkt das Attribut, welches mir dafür in den Sinn kommt. :wink:
Aber ja es funktioniert und ist wahrscheinlich sogar recht effizient.

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von Mathias »

Kann schon sein, aber Mathias wollte eine Lösung mit "log" haben.
Genau dies suchte ich, und es sollte mit x-beliebigen Werte funktionieren, vor allem auch mit Fliesskommazahlen.

Die Unit Math landet schlussendlich hier:

Code: Alles auswählen

    function Ln(d : ValReal) : ValReal;[internproc:fpc_in_ln_real];
Ich denke, da wir die FPU direkt angesteuert.

Was noch spannend wäre, kann man log auch in einer Formel auflösen ?

In GLSL gibt es nur log(x).
Und FPC stellt nur dies zur Verfügung:

Code: Alles auswählen

function Log10(x : float) : float;
function Log2(x : float) : float;
function LogN(n,x : float) : float; 
Nur was gleicht jetzt dem von GLSL ?
Auf "Length" ist er wahrscheinlich auch gekommen.
Bei Ganzzahlen wäre dies sicher die einfachste Lösung.
Da wäre noch spannend, ob da die FPU oder Length() schneller arbeiten ?

Nachtrag:
Da muss man auch noch im Hinterkopf behalten.
In der uses Math ist der float gar kein Single !

Code: Alles auswählen

      type
         Float = extended;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Mathe Funktion zum ebnen gesucht.

Beitrag von wp_xyz »

Mit log() ist möglicherweise der natürliche Logarithmus gemeint. In Pascal ist das die ln() Funktion - die ist übrigens in der system Unit, nicht in Math.

Wenn du den 10er-Logarithmus brauchst (log10, für z.B. log10(100) = 2) und Math nicht verwenden willst, musst du das ln()-Ergebnis durch ln(10) dividieren:

log10(x) = ln(x)/ln(10)

Antworten