Autor Beitrag
NCortex
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 126

WIN 2000
D7 Enterprise
BeitragVerfasst: Fr 02.01.04 12:46 
theoretisch sollten nach meinen Kenntnissen diese Beiden Programme dassselbe ausspucken...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
begin
    i:= 0;max:= 0;n:=0;

    eingabe:=100000;
    for m := eingabe Downto 0 do
    begin

    i := 0;
    n := m;
        while (n > 1do
            begin
            inc(i);
            if (n mod 2 = 0 ) then
                n := n div 2
            else
                n := 3 * n + 1;
            end;
    if (i >= max) then begin
        writeln('Max: ' + inttostr(m) + ' mit ' + inttostr(i) + ' Iterationen.');
        max := i;
                  end;
     end;
writeln('beliebige Taste zum Beenden....');
readln;
end;{ TODO -oUser -cConsole Main : Hier Code einfügen }
end.

und
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
public class prog
{
    public static void main (String[] args)
    {
    long i = 0, max = 0,n=0,eingabe;

    eingabe = 100000;

    for(long m = eingabe; m>=0; m--)
    {
    i = 0;
    n = m;  
        while (n > 1) {
            i++;
            if (n % 2 == 0 )
                n = n / 2; 
            else 
                {n = 3 * n + 1;}
        };
    if (i >= max){
        System.out.println("Max: " + m + " mit " + i + " Iterationen.");
    max = i;
     }
        };
    }
}


Die ersten Paar werte sind noch gleich, dann gehen sie auseinander :-/
woran kann das liegen? hab schon aus verzweiflung optimierung in delphi ausgeschaltet... oder entspricht "mod" nicht % in java?

kann mir das einer erklären?? danke

_________________
"...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.01.04 18:12 
Titel: Mal sehen...
Hallo!

Nun ja, da die einzige Stelle, an der ein nicht genauer Wert benutzt wird, die ist, an der n:=n div 2 steht, würde ich mal da den Unterschied vermuten. Ich mache nicht viel in Java, aber wenn ich mich recht an meine gerade beendete Schulzeit erinnere, rundet der Operator / in Java, während div in Delphi den ganzzahligen Anteil zurückgibt (also mit der Gauss-Klammer in der Mathematik vergleichbar ist).

Probier einfach mal eine Wertetabelle, in der Du div und / vergleichst!
Und sieh mal im SDK nach, ich glaube es gab eine Funktion, die div entspricht.

Viel Erfolg!
S.J.
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Fr 02.01.04 23:30 
In meinen Vorlesungen hab ich über Java folgendes gelernt:
Bei der reinen Integer-Division liefert der /-Operator den generischen ganzzahligen Teil der Division, entspricht also div. Nur wenn es sich bei der Division um eine Fließkomma-Zahl handelt, also mind. einer der Operanden eine Fließkommazahl ist, wird auch eine Fließkommazahl zurückgegeben.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 03.01.04 20:46 
...ausserdem ist das ganz egal, weil das Ergebnis der Division sowieso eine ganze Zahl ist, da sie nur ausgeführt wird, wenn man eine gerade Zahl hat.
Ich würde eher eine Bereichsüberschreitung vermuten, und wenn bei Java / Delphi die verschiedenen IntegerTypen anders definiert sind, dann kommt man zu unterschiedlichen Ergebnissen...

_________________
We are, we were and will not be.
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: So 04.01.04 14:26 
Sofern vorzeichenbehaftete Typen verwendet werden, müsste das Verhalten bei beiden Sprachen gleich sein, es müsste nämlich ein "Umklappen" der Zahl am Ende des Wertebereichs stattfinden.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
MaxiTB
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: So 04.01.04 16:47 
Titel: Bereichsüberschreitung
Der long in Java ist eine 64bit-Zahl !
Das ist meiner Meinung nach der einzige Unterschied - obwohl ich mich düster erinnern kann, daß bei einer integer-Division gerundet wird (was aber nicht sein muß - wie gesagt, düster in Erinnerung :wink: ). Das Runden ist doch entscheidend weil dann ...

Delphi: 0 div 2=0, 1 div 2=0, 2 div 2=1
Java: 0/2=0, 1/2=1, 2/2=1

Aber im dem Fall denke ich mal hängt es damit zusammen, daß du in Delphi integer und nicht int64 verwendest.

BTW Overflows bei integer würde ich in so einem Fall sowieso ein bisserl mit Augenblinzeln kritisieren 8) ; das macht man doch nicht, weil das Resultat dann ja falsch ist.

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 04.01.04 18:00 
Aber guck mal bitte in den Quelltext, WANN n durch 2 geteilt wird. Nur dann, wenn n gerade ist. Es ist dann egal, ob ab- und aufgerundet wird, oder ob nur der ganzzahlige Teil genommen wird oder sonstwas. Eine gerade Zahl durch 2 geht immer glatt auf. Also kann da der Fehler nicht liegen!

Und dass das Ergebnis bei nem Overflow falsch wird, versteht sich ja wohl von selbst...

Lass doch mal nach jedem Schritt das n ausgeben, odre mach ne Abfrage, ob es negativ ist, und brechh dann mit ner Fehlermeldung ab...

_________________
We are, we were and will not be.
MaxiTB
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: So 04.01.04 18:05 
Titel: ::Gausi
Ups :oops: ... da wird noch gemodet *g*.

Okay, dann ists der Overflow. :P

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 04.01.04 20:57 
Also, ich hab jetzt mal den Delphi-Code kopiert und leicht modifiziert, d.h. das writeln() durch memo1.lines.add() ersetzt und alle Variablen als integer deklariert, und dann auch den JavaCode kopiert und mal beides laufen lassen.

Das Java-Progg spuckt das aus
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Max: 100000 mit 128 Iterationen.
Max: 99999 mit 226 Iterationen.
Max: 99819 mit 234 Iterationen.
Max: 99817 mit 234 Iterationen.
Max: 99775 mit 265 Iterationen.
Max: 99743 mit 265 Iterationen.
Max: 99721 mit 327 Iterationen.
Max: 99067 mit 327 Iterationen.
Max: 95081 mit 327 Iterationen.
Max: 91463 mit 332 Iterationen.
Max: 88059 mit 332 Iterationen.
Max: 87087 mit 332 Iterationen.
Max: 78791 mit 337 Iterationen.
Max: 77031 mit 350 Iterationen.


Und das Delphi-Progg das hier
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Max: 100000 mit 128 Iterationen.
Max: 99999 mit 226 Iterationen.
Max: 99819 mit 234 Iterationen.
Max: 99817 mit 234 Iterationen.
Max: 99775 mit 265 Iterationen.
Max: 99743 mit 265 Iterationen.
Max: 99721 mit 327 Iterationen.
Max: 99067 mit 327 Iterationen.
Max: 95081 mit 327 Iterationen.
Max: 91463 mit 332 Iterationen.
Max: 88059 mit 332 Iterationen.
Max: 87087 mit 332 Iterationen.
Max: 78791 mit 337 Iterationen.
Max: 77031 mit 350 Iterationen.

Ehrlich gesagt, sehe ich da keinen Unterschied, oder ich muss mal zum Augenarzt...

_________________
We are, we were and will not be.