Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ Welcher Befehl rundet wie "Round" in Borland C++ ? (https://www.delphipraxis.net/156127-welcher-befehl-rundet-wie-round-borland-c.html)

madina 20. Nov 2010 23:31

Welcher Befehl rundet wie "Round" in Borland C++ ?
 
MFG
Ati

Luckie 20. Nov 2010 23:33

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Wie rundet den Round in C/C++? Und was gefällt dir nicht an Round in Delphi?

Assarbad 20. Nov 2010 23:42

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von Luckie (Beitrag 1062944)
Wie rundet den Round in C/C++? Und was gefällt dir nicht an Round in Delphi?

Es steht anzunehmen, daß es schlecht bis nicht rundet. Denn es gibt bspw. in (XE) keine Funktion Round() im C++ Builder.

Es steht also durchaus zu vermuten, daß vielleicht bereits die Delphi-Funktion genutzt wird.

Ansonsten lohnt sich vielleicht noch ein Blick in Delphi-Referenz durchsuchenSetRoundMode und Delphi-Referenz durchsuchenGetRoundMode.

madina 20. Nov 2010 23:56

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Hallo,

ich habe ein DLL, der in C++ Werte berechnet da habe ich festgestellt, daß bei Delphi für einen Wert Round(46.57142857)=47 herausgibt und bei Borland C++ ceil(46.57142857)=46 herausgibt.

Meine Frage wie kann ich den Delphi Round() Fkt genauso in C++ haben mit dem gleichen Ergebnis.

MFG

Luckie 20. Nov 2010 23:59

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Ähm, du weißt aber, dass Round und Ceil zwei unterschiedliche Funktionen sind? Deswegen heißt Ceil ja auch Ceil und nicht Round. Ceil rundet immer auf. Das Gegenstück wäre Floor.

PS: Hast du mal nur zum Spaß mal Ceil in der Delphi Hilfe eingegeben?

Assarbad 21. Nov 2010 00:02

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von madina (Beitrag 1062947)
ich habe ein DLL, der in C++ Werte berechnet da habe ich festgestellt, daß bei Delphi für einen Wert Round(46.57142857)=47 herausgibt und bei Borland C++ ceil(46.57142857)=46 herausgibt.

ceil und floor haben eine komplett andere Bedeutung. Hier gibt es eine Lösung des Problems (suche dort nach "rndup").

Luckie 21. Nov 2010 00:06

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
@Assarbad: Es gibt auch Ceil in Delphi. Und das ist es ja, was er sucht.

Assarbad 21. Nov 2010 00:09

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
:wall:

Wow, die Frage war auch ziemlich verschwurbelt gestellt. :roll:

Luckie 21. Nov 2010 00:10

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Du bist wohl etwas aus der Übung, was Delphi Foren angeht. ;)

himitsu 21. Nov 2010 10:18

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von Assarbad (Beitrag 1062950)
Hier gibt es eine Lösung des Problems (suche dort nach "rndup").

rndup = Delphi-Referenz durchsuchenRoundTo
cint = mathematisches Runden
Delphi-Referenz durchsuchenRound = dieses komische Bankenrunden, wo jedes Zweite .5 abgerundet wird :wall:

madina 21. Nov 2010 11:38

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Hallo,

leider kein Erfolg.

Also ich suche in Borland C++ eine Fkt, der den gleichen wie in Delphi Round() macht.


MFG

mkinzler 21. Nov 2010 11:42

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Dann nimm am Besten die Delphi Funktion.

himitsu 21. Nov 2010 11:45

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Das Delphi-Round wendet sich direkt an den mathematischen CoProzessor und in C++ sollte es auch eine Funktion geben, welche das Gleiche macht
und demnach das selbe Ergebnis liefern sollte.

In Borland C++ würde ich erwarten, daß diese Funktion ebenfalls "round" heißt.

Delphi-Quellcode:
{ Procedures and functions that need compiler magic }

procedure      _ROUND;
asm
        { ->   FST(0) Extended argument      }
        { <-    EDX:EAX Result                 }

        SUB    ESP,8
        FISTP  qword ptr [ESP]
        FWAIT
        POP    EAX
        POP    EDX
end;

PS: Runden ist nicht gleich Runden ... siehe Delphi-Referenz durchsuchenSet8087CW und Delphi-Referenz durchsuchenSetRoundMode

madina 21. Nov 2010 11:51

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Hallo,

leider keinen Erfolg.

Ich suche eine Fkt in Borland C++, die das gleiche macht wie Delphi.Round(); z.B: 326/7=47.

MFG

mkinzler 21. Nov 2010 11:54

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Nottfalls mit
Code:
y = ceil(x + 0.5);

Robotiker 21. Nov 2010 12:18

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von mkinzler (Beitrag 1063030)
Nottfalls mit
Code:
y = ceil(x + 0.5);

Zumindest eine Unterscheidung für negative Zahlen sollte man da einbauen.

Hier noch ein paar andere Varianten:
http://www.c-plusplus.de/forum/39342

Valle 21. Nov 2010 13:42

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Hallo,

wie wäre es, wenn du uns mal mitteilst, wie genau gerundet werden soll?
  • immer aufrunden
  • immer abrunden
  • runden wie man es in der Grundschule lernt
  • ...

Liebe Grüße,
Valentin

Satty67 22. Nov 2010 08:21

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von Valle (Beitrag 1063053)
wie wäre es, wenn du uns mal mitteilst, wie genau gerundet werden soll?

Wurde schon mehrmals beantwortet... genauso runden wie die Delphi Funktion Round() rundet ;)

Also
Code:
Round(9,00) = 9
Round(9,05) = 9
Round(9,10) = 9
Round(9,15) = 9
Round(9,20) = 9
Round(9,25) = 9
Round(9,30) = 9
Round(9,35) = 9
Round(9,40) = 9
Round(9,45) = 9
Round(9,50) = 10
Round(9,55) = 10
Round(9,60) = 10
Round(9,65) = 10
Round(9,70) = 10
Round(9,75) = 10
Round(9,80) = 10
Round(9,85) = 10
Round(9,90) = 10
Round(9,95) = 10
Round(10,00) = 10
Womit mkinzler in Post #15 eine passende Lösung angeboten hatte. (€: als Lösungs-Ansatz)

gammatester 22. Nov 2010 08:30

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von Satty67 (Beitrag 1063205)
Zitat:

Zitat von Valle (Beitrag 1063053)
wie wäre es, wenn du uns mal mitteilst, wie genau gerundet werden soll?

Wurde schon mehrmals beantwortet... genasuo runden wie die Delphi Funktion Round() rundet ;)
Womit mkinzler in Post #15 eine passende Lösung angeboten hatte.

Nicht ganz: round(8.5) = 8 aber ceil(8.5+0.5) = 9.

Satty67 22. Nov 2010 09:14

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Weshalb der/die TS noch sagt, es passt nicht. Aber der Ansatz ist richtig und sollte keine Herausforderung sein.

himitsu 22. Nov 2010 10:18

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von Satty67 (Beitrag 1063205)
Zitat:

Zitat von Valle (Beitrag 1063053)
wie wäre es, wenn du uns mal mitteilst, wie genau gerundet werden soll?

Wurde schon mehrmals beantwortet... genauso runden wie die Delphi Funktion Round() rundet ;)

Zitat:

Zitat von gammatester (Beitrag 1063207)
Nicht ganz: round(8.5) = 8 aber ceil(8.5+0.5) = 9.

Genau und das sagte ich ja schon.

Das Round vom Delphi (also renauer die Recheneinheit des PCs) rundet so wie es die Banken machen.
Code:
Round(0,49) = 0
Round(0,50) = 0 v
Round(0,51) = 1
Round(1,49) = 1
Round(1,50) = 2 ^
Round(1,51) = 2
Round(2,49) = 2
Round(2,50) = 2 v
Round(2,51) = 3
Round(3,49) = 3
Round(3,50) = 4 ^
Round(3,51) = 4
Round(4,49) = 4
Round(4,50) = 4 v
Round(4,51) = 5
Das soll irgendwie gerechter sein, da, wenn man mit einer festen Anzahl an Nachkommastellen arbeitet, sonst mehr auf als abgerundet wird.
Denn es gibt eine ungerade Anzahl an Werten. (ab 0.5 Einer mehr)

mathematisches Runden
abdunden: 0.1 0.2 0.3 0.4
aufrunden: 0.5 0.6 0.7 0.8 0.9
nicht runden: 0.0

dieses Banken-Runden
abdunden: 0.1 0.2 0.3 0.4
im wechsel auf oder ab: 0.5
aufrunden: 0.6 0.7 0.8 0.9
nicht runden: 0.0

Satty67 22. Nov 2010 11:14

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Ist mir noch gar nicht aufgefallen (hätte die Werte besser zweimal nacheinander ausgeben lassen). Wie wird gewechselt bzw. wo wird der letzte Wechsel ob auf oder ab gespeichert?

Wäre in dem Fall ja schwer bis gar nicht vorhersagbar, ob ein Round nun gerade auf oder abrundet. Man kann in der C++ DLL ja nicht vorhersehen, wie die Zahl beim nächsten mal von Delphi behandelt wird.

€: Der Wechsel ist wohl auf einen Funktions-Block beschränkt. Neuer Block, immer erst mal aufrunden. Ist aber dann fast einfacher, für Delphi und C++ eine mathematische Version zu verwenden, statt zu versuchen, das in C++ zu raten?

€2: Also runden wie in Delphi nachbauen OK. Runden wie Delphi den gleichen Datenbestand runden wird/würde, schwer bis unmöglich.

himitsu 22. Nov 2010 12:03

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Es ist schon vorhersehbar.

gerade Zahl vor dem Komma > 0.5 abrunden
ungerade Zahl vor dem Komma > 0.5 aufrunden

(also bei den positiven Zahlen ... negative wird es ähnlich sein, hab'sch jetzt aber noch nicht nachgesehn)

madina 22. Nov 2010 13:29

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Hallo,

wie genau gerundet werden soll?

es sollte auf maximal 2 Vorkomma wie Delphi.Round() in Borland C++ 5.01 gerundet werden.

MFG

Luckie 22. Nov 2010 14:03

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von madina (Beitrag 1063276)
es sollte auf maximal 2 Vorkomma wie Delphi.Round() in Borland C++ 5.01 gerundet werden.

Kann es sein, das in dem Satz ein Wort oder so fehlt? So ist er für mich unverständlich. Und was soll das jetzt mit den Vorkomma(stellen)?

Satty67 22. Nov 2010 14:11

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von himitsu (Beitrag 1063256)
gerade Zahl vor dem Komma > 0.5 abrunden
ungerade Zahl vor dem Komma > 0.5 aufrunden

Das sollte dann ja machbar sein. So ganz banal mit MOD 2 prüfen und dann ensprechen .4 oder .5 addieren und je nach Vorzeichen floor oder ceil oder gleich modf.

madina 22. Nov 2010 15:49

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Hallo,

machen wir's einfach.

1. Wie funktioniert Delphi.Round(); (was steckt dahinter) um dies in BorlandC++.Fkt() umzuschreiben ?

2. Bitte um Beispiele mit Sourcecode

MFG

gammatester 22. Nov 2010 16:05

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Zitat:

Zitat von madina (Beitrag 1063308)
1. Wie funktioniert Delphi.Round(); (was steckt dahinter) um dies in BorlandC++.Fkt() umzuschreiben ?

round rundet zum nächste Integer unter Verwendung des eingestellten Rundungsmodus. Standard-C hat dafür
Code:
int lrint(double x);
Allerdings scheint BorlandC++ genauso wenig Standard, wie Delphi Standard-Pascal ist.
Zitat:

Zitat von madina (Beitrag 1063308)
2. Bitte um Beispiele mit Sourcecode

Hier notfalls ein Round-To-Even:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

long int roundtoeven(double x) {
  double y;
  long l;
  y = 2.0*x;
  if (floor(y)==y) {
    l = (long) y;
    if ((l & 3) == 3) l++;
    l = l >> 1;
  }
  else {
    l = floor(x+0.5);
  }
  return l;
}


int main (void) {
  double x;
  long int l,i;

  for (i=-50;i<=100;i++) {
    x = 0.1*i;
    l = roundtoeven(x);
    printf("%f %d\n", x, l);
  }

  return 0;
}

madina 22. Nov 2010 18:13

AW: Welcher Befehl rundet wie "Round" in Borland C++ ?
 
Hallo,

vielen Dank dies ist die Lösung:

roundtoeven(double x);

MFG


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz