[Erledigt] Wanted: ClosestNumber / ClosestValue
- 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
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 ...
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 ...
Re: Wanted: ClosestNumber / ClosestValue
Hallo,
ist das nicht einfach?
Einmal die Liste abklappern und mit dem Wert vergleichen und immer den gerade "nächsten" <> Wert speichern.
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
Re: Wanted: ClosestNumber / ClosestValue
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.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 ...
Re: Wanted: ClosestNumber / ClosestValue
Kommt ein bisschen auf das Szenario an.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 ...
Wenn du aus der gleichen Liste immer wieder Werte suchen musst, würde ich zuerst sortieren.
Da gibt es viele Ansätze.
-
- 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
Ich verstehe die Frage nicht ganz.kennt jemand von Euch eine Funktion, um den nahesten / dichtesten Zahlenwert (z. B. aus einem array) zu einer Zahl zu finden?
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
Mit Java und C/C++ sehe ich rot
- 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
Es ging mir in erster Linie darum, ob etwas vorhanden ist - ich habe eine (ohne "KI"theo hat geschrieben: Sa 22. Jun 2024, 13:00Kommt ein bisschen auf das Szenario an.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 ...
Wenn du aus der gleichen Liste immer wieder Werte suchen musst, würde ich zuerst sortieren.
Da gibt es viele Ansätze.

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 ...
- 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
Wieso? Zu was anderem als ganz einfachen Sachen sind die "KI" doch gar nicht brauchbar ...wp_xyz hat geschrieben: Sa 22. Jun 2024, 12:04Sorry, 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.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 ...

Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...
Re: Wanted: ClosestNumber / ClosestValue
"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.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 ...
Das ist übrigens keine Gemeinheit von Pascal, sondern in vielen Programmiersprachen sol.
- 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
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 ...wp_xyz hat geschrieben: Sa 22. Jun 2024, 20:56
...
Das ist übrigens keine Gemeinheit von Pascal, sondern in vielen Programmiersprachen sol.
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 ...
- 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
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 ...
Re: [Erledigt] Wanted: ClosestNumber / ClosestValue
Hallo,
wenn Dein Vergleichswert aFloat im Feld aFA vorkommt, wird er den auch finden.
Das versuchte ich zu vermeiden.
Gruß Horst
wenn Dein Vergleichswert aFloat im Feld aFA vorkommt, wird er den auch finden.
Das versuchte ich zu vermeiden.
Gruß Horst
- 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
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 ...