[Erledigt] Wanted: ClosestNumber / ClosestValue

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 602
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

[Erledigt] Wanted: ClosestNumber / ClosestValue

Beitrag von Niesi »

Guten Morgen,

kennt jemand von Euch eine Funktion, um den nahesten / dichtesten Zahlenwert (z. B. aus einem array) zu einer Zahl zu finden?

Ich habe hier gesucht, bin mit Entenschritten durchs web gewatschelt, habe 'ne sogenannte "KI" befragt, gegoogelt - nix. Python hat so etwas ...
Zuletzt geändert von Niesi am So 23. Jun 2024, 08:36, insgesamt 1-mal geändert.
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Horst_h
Beiträge: 74
Registriert: Mi 20. Mär 2013, 08:57

Re: Wanted: ClosestNumber / ClosestValue

Beitrag von Horst_h »

Hallo,

ist das nicht einfach?
Einmal die Liste abklappern und mit dem Wert vergleichen und immer den gerade "nächsten" <> Wert speichern.

Code: Alles auswählen

program findNearest;
type
  tValue = Uint32;
  tFeld = array of tValue;

function FindNearestIdx(value: TValue;const Feld: tFeld):int32;
var
  minIdx,i : Int32;
  minDelta,delta : tValue;
begin
  MinIdx := Low(Feld);
  while (Feld[MinIdx] = value) AND (MinIdx<High(Feld)) do
    inc(minIdx);
  minDelta := abs(Feld[MinIdx]-value);
  For i := minIdx+1 to High(Feld) do
  begin
    delta := abs(Feld[i]-value);
    if delta <> 0 then
      if (delta < minDelta) AND (minDelta<>delta) then
      begin
        minIdx := i;
        minDelta := delta;
      end;
  end;
  result := minIdx;
end;


var
  feld : tFeld;
  i,idx : Int32;
begin
  randomize;
  setlength(Feld,10000);
  For i := Low(Feld) to High(Feld) do
    Feld[i] := random(length(Feld));
  For i := Low(Feld) to High(Feld) do
  Begin
    idx := FindNearestIdx(Feld[i],Feld);
    writeln(i:5,Feld[i]:6,' nearest @ ',idx:5,Feld[idx]:6)
  end;
end.

 9987  7907 nearest @   652  7908
 9988  6452 nearest @  2116  6453
 9989  7707 nearest @  7258  7706
 9990   441 nearest @    63   442
 9991  4878 nearest @   293  4879
 9992    78 nearest @  3043    79
 9993  9440 nearest @  4627  9439
 9994  4506 nearest @   335  4507
 9995   510 nearest @  6275   508
 9996  4259 nearest @  2726  4260
 9997  8707 nearest @  9188  8706
 9998   433 nearest @  5908   432
 9999  2972 nearest @  4071  2973

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

Re: Wanted: ClosestNumber / ClosestValue

Beitrag von wp_xyz »

Niesi hat geschrieben: Sa 22. Jun 2024, 11:14 Guten Morgen,

kennt jemand von Euch eine Funktion, um den nahesten / dichtesten Zahlenwert (z. B. aus einem array) zu einer Zahl zu finden?

Ich habe hier gesucht, bin mit Entenschritten durchs web gewatschelt, habe 'ne sogenannte "KI" befragt, gegoogelt - nix. Python hat so etwas ...
Sorry, ich werde jetzt gemein: Also wenn wir wegen trivialer Probleme mit der Schwierigkeit von "Was ist 1+1?" eine KI brauchen, hat die Menschheit ihr intellektuelles Ende erreicht.

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

Re: Wanted: ClosestNumber / ClosestValue

Beitrag von theo »

Niesi hat geschrieben: Sa 22. Jun 2024, 11:14 Guten Morgen,

kennt jemand von Euch eine Funktion, um den nahesten / dichtesten Zahlenwert (z. B. aus einem array) zu einer Zahl zu finden?

Ich habe hier gesucht, bin mit Entenschritten durchs web gewatschelt, habe 'ne sogenannte "KI" befragt, gegoogelt - nix. Python hat so etwas ...
Kommt ein bisschen auf das Szenario an.
Wenn du aus der gleichen Liste immer wieder Werte suchen musst, würde ich zuerst sortieren.
Da gibt es viele Ansätze.

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

Re: Wanted: ClosestNumber / ClosestValue

Beitrag von Mathias »

kennt jemand von Euch eine Funktion, um den nahesten / dichtesten Zahlenwert (z. B. aus einem array) zu einer Zahl zu finden?
Ich verstehe die Frage nicht ganz.

Meinst du was in dieser Art ?
[10, 20, 23, 30, 30, 50] Die 20 und 23 sind am nahesten zusammen. Somit suchst du 3 ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 602
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Wanted: ClosestNumber / ClosestValue

Beitrag von Niesi »

theo hat geschrieben: Sa 22. Jun 2024, 13:00
Niesi hat geschrieben: Sa 22. Jun 2024, 11:14 Guten Morgen,

kennt jemand von Euch eine Funktion, um den nahesten / dichtesten Zahlenwert (z. B. aus einem array) zu einer Zahl zu finden?

Ich habe hier gesucht, bin mit Entenschritten durchs web gewatschelt, habe 'ne sogenannte "KI" befragt, gegoogelt - nix. Python hat so etwas ...
Kommt ein bisschen auf das Szenario an.
Wenn du aus der gleichen Liste immer wieder Werte suchen musst, würde ich zuerst sortieren.
Da gibt es viele Ansätze.
Es ging mir in erster Linie darum, ob etwas vorhanden ist - ich habe eine (ohne "KI" :mrgreen: ) selbst geschriebene Variante im Gang. Aber ich setze auf Standards. Da es so etwas in Python, C usw. gibt, wollte ich sicher sein, dass es so etwas ausgerechnet in Pascal (inkl. Delphi) nicht gibt, warum auch immer.

Weil Aufrunden in Pascal "Ceil" heißt, worauf ich nie gekommen wäre, wollte ich mal fragen ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 602
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Wanted: ClosestNumber / ClosestValue

Beitrag von Niesi »

wp_xyz hat geschrieben: Sa 22. Jun 2024, 12:04
Niesi hat geschrieben: Sa 22. Jun 2024, 11:14 Guten Morgen,

kennt jemand von Euch eine Funktion, um den nahesten / dichtesten Zahlenwert (z. B. aus einem array) zu einer Zahl zu finden?

Ich habe hier gesucht, bin mit Entenschritten durchs web gewatschelt, habe 'ne sogenannte "KI" befragt, gegoogelt - nix. Python hat so etwas ...
Sorry, ich werde jetzt gemein: Also wenn wir wegen trivialer Probleme mit der Schwierigkeit von "Was ist 1+1?" eine KI brauchen, hat die Menschheit ihr intellektuelles Ende erreicht.
Wieso? Zu was anderem als ganz einfachen Sachen sind die "KI" doch gar nicht brauchbar ... :mrgreen:
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

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

Re: Wanted: ClosestNumber / ClosestValue

Beitrag von wp_xyz »

Niesi hat geschrieben: Sa 22. Jun 2024, 16:12 Weil Aufrunden in Pascal "Ceil" heißt, worauf ich nie gekommen wäre, wollte ich mal fragen ...
"Ceil" ist kurz für "ceiling" = "Zimmerdecke", im Gegensatz zu "Floor" = Fußboden. Wenn ich also mit "ceil" runde, dann runde ich immer zum größeren Integer hin (in Richtung Zimmerdecke(, auch bei negativen Zahlen: ceil(1.9) = 2; ceil(-1.9) = -1. "Floor" dagegen rundet immer zur kleineren Ganzzahl, auch wieder bei negativen Zahlen: Floor(1.9) = 1, Floor(-1.9) = -2.

Das ist übrigens keine Gemeinheit von Pascal, sondern in vielen Programmiersprachen sol.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 602
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Wanted: ClosestNumber / ClosestValue

Beitrag von Niesi »

wp_xyz hat geschrieben: Sa 22. Jun 2024, 20:56
...

Das ist übrigens keine Gemeinheit von Pascal, sondern in vielen Programmiersprachen sol.
Das habe ich mir mal angesehen - es stimmt - was mich tatsächlich erstaunt. Mein Erstaunen soll keine Kritik sein - ich habe mich einfach gewundert. In Calc heißt es einfach "RoundUp(x.x)", umgangssprachlich ja auch. Jedenfalls wieder was gelernt ...

Halten wir mal fest: Eine Funktion zum Finden des nahesten / dichtesten Zahlenwert (z. B. aus einem array) zu einer vorgegebenen Zahl gibt es als Free-Pascal Standardfunktion nicht ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 602
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Wanted: ClosestNumber / ClosestValue

Beitrag von Niesi »

Horst_h hat geschrieben: Sa 22. Jun 2024, 11:56 Hallo,

ist das nicht einfach?
Einmal die Liste abklappern und mit dem Wert vergleichen und immer den gerade "nächsten" <> Wert speichern.

Code: Alles auswählen

program findNearest;
type
  tValue = Uint32;
  tFeld = array of tValue;

function FindNearestIdx(value: TValue;const Feld: tFeld):int32;
var
  minIdx,i : Int32;
  minDelta,delta : tValue;
begin
  MinIdx := Low(Feld);
  while (Feld[MinIdx] = value) AND (MinIdx<High(Feld)) do
    inc(minIdx);
  minDelta := abs(Feld[MinIdx]-value);
  For i := minIdx+1 to High(Feld) do
  begin
    delta := abs(Feld[i]-value);
    if delta <> 0 then
      if (delta < minDelta) AND (minDelta<>delta) then
      begin
        minIdx := i;
        minDelta := delta;
      end;
  end;
  result := minIdx;
end;


var
  feld : tFeld;
  i,idx : Int32;
begin
  randomize;
  setlength(Feld,10000);
  For i := Low(Feld) to High(Feld) do
    Feld[i] := random(length(Feld));
  For i := Low(Feld) to High(Feld) do
  Begin
    idx := FindNearestIdx(Feld[i],Feld);
    writeln(i:5,Feld[i]:6,' nearest @ ',idx:5,Feld[idx]:6)
  end;
end.

 9987  7907 nearest @   652  7908
 9988  6452 nearest @  2116  6453
 9989  7707 nearest @  7258  7706
 9990   441 nearest @    63   442
 9991  4878 nearest @   293  4879
 9992    78 nearest @  3043    79
 9993  9440 nearest @  4627  9439
 9994  4506 nearest @   335  4507
 9995   510 nearest @  6275   508
 9996  4259 nearest @  2726  4260
 9997  8707 nearest @  9188  8706
 9998   433 nearest @  5908   432
 9999  2972 nearest @  4071  2973


Dankeschön, ich habe es so gemacht:

Code: Alles auswählen

ffunction ClosestNumber(aFloat: extended; aFA: array of extended): extended;
var
  i: integer;
begin
  Result := aFA[0];
  for i := 1 to length(aFA)-1 do
  begin
    if abs(Result - aFloat) > abs(aFA[i] - aFloat) then Result := aFA[i];
  end;
end; 

Edit: Erst war meine Lösung mit Arrays, deren erster INdex [1] ist - das ist aber nicht gut, weil das mit dynamischen Arrays nicht klappt.

Daher die Änderung in Arrays, deren erster Wert den Index [0] hat. Dann geht es auch mit dynamischen Arrays ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Horst_h
Beiträge: 74
Registriert: Mi 20. Mär 2013, 08:57

Re: [Erledigt] Wanted: ClosestNumber / ClosestValue

Beitrag von Horst_h »

Hallo,

wenn Dein Vergleichswert aFloat im Feld aFA vorkommt, wird er den auch finden.
Das versuchte ich zu vermeiden.

Gruß Horst

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 602
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: [Erledigt] Wanted: ClosestNumber / ClosestValue

Beitrag von Niesi »

Wieso? Ich suche den Wert in der Liste, welcher aFloat am nahesten ist - wenn ein Wert mit aFloat identisch ist, dann ist das der nahestmögliche Wert und wird hoffentlich gefunden ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Antworten