"Quizfrage" aus Javainsel

Status
Nicht offen für weitere Antworten.

UdoKessler

Mitglied
Hi,

bin blutiger Anfänger und lerne gerade mit dem Buch "Java ist auch eine Insel".

Ab und zu kommen kurze Fragen..ich denke mehr als
Scherz, aber man sieht auch, ob man aufgepasst hat.
Da keine "Lösungen" dabeistehen, wollt ich Euch fragen, ob ich richtig liege..

Also:

Rätsel Warum übersetzt der Compiler Folgendes ohne Murren?

(Listing 2.16 WithoutComplain.java)
Code:
class WithoutComplain 
{ 
  static void main( String[] args ) 
  { 
    http://www.tutego.com/ 
    System.out.print( "Da gibt's Java-Tipps und Tricks." ); 
  } 
}
Ich denke, daß das "http:" als Sprungmarke für break/continue-Anweisungen
verstanden wird und das dahinter als Kommentar (wegen "//").

Deshalb jammert der Compiler nicht..

Liege ich richtig?


Gruß
Udo
 
Zuletzt bearbeitet:

UdoKessler

Mitglied
Sehr schön :)


Hier hab ich noch was kleines:

Frage Was gibt die folgende Anweisung aus?



Code:
 System.out.println( 123456789 + 5432l );


Naja, also die Consolen-Ausgabe ist: 123462221
aber wenn ich nachrechne müsste 123511110 rauskommen!

Wo ist das Problem?

Ich vermute einen Überlauf...?
 
S

SlaterB

Gast
Code:
5432l

nicht alle diese Zeichen sind Ziffern ;)
 

UdoKessler

Mitglied
Ahh!
So ein Mistkerl! :) (Edit: Also der Autor, nicht maki!)

Das ist mir gar nicht aufgefallen!
Kurz vorher hat er noch drüber geschrieben, daß man sowas
vermeiden sollte..voll drauf reingefallen.
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
weil floats nicht so viele nachkommastellen auflösen können, die mantisse ist zu kurz.

Wenn man sich das am Zehnersystem veranschaulichen will, dann wird 20000000000 als
2*10^10 gespeichert. Man könnte da zB auch 2.123*10^10 speichern, wenn die mantisse vier stellen darstellen könnte (2.123), aber mehr passt da nicht rein, deswegen wird die vernachlässigbare Nachkommastelle einfach abgeschnitten:
2000000000001f=2.00000000001*10^10~2.0*10^10 == 20000000000000f

Siehe hier: IEEE 754 ? Wikipedia
 

UdoKessler

Mitglied
Danke Euch..

wenn ich ein d dahinter mache, dann erkennt er es als false (wie ich ebengemerkt habe), weil der Typ double mehr Nachkommastellen auflöst, stimmts..

Gruß
Udo
 

UdoKessler

Mitglied
Wo wir es gerade von Ungenauigkeit haben..
Wenn ich eine float inkrementiere, und zwar immer um 0.1,
wieso wird das dann so schnell ungenau?

Edit: Man müsste doch annehmen, daß 1 Stelle nach dem Komma
kein Problem sein dürfte..


Code:
for (float i = 0; i < 1.1; i += 0.1)
      System.out.println(i);
Ausgabe:

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
1.0000001

Das selbe mit double:

0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
 

tfa

Top Contributor
0,1 kann man im Binärsystem nicht exakt darstellen. Das ist sozusagen ein periodischer Bruch.
Probier es mal mit einer Zweierpotenz:

[HIGHLIGHT="Java"]for (float i = 0; i < 100.125; i += 0.125)
System.out.println(i);[/HIGHLIGHT]
 

Der Müde Joe

Top Contributor
>wieso wird das dann so schnell ungenau?

weil es recht schwer ist, gewisse Zahlen im Zweiersystem darzustellen
Wie im 10er System zB 1/3
 

Leroy42

Top Contributor
Ahh!
So ein Mistkerl! :) (Edit: Also der Autor, nicht maki!)

Das ist mir gar nicht aufgefallen!
Kurz vorher hat er noch drüber geschrieben, daß man sowas
vermeiden sollte..voll drauf reingefallen.

Noch ein Hinweis an die, die es bis jetzt nicht aufgegangen ist

(wie z.B. bei mir bis vor kurzem :oops:)

Code:
5432L == 5432l
 

UdoKessler

Mitglied
@tfa u Joe

Natürlich, ist auch logisch..
0,3333333....... :)


@Leroy
Mir wäre es (ohne Wink mit dem Zaunpfahl) garnicht aufegfallen. :)


Danke für Eure Hilfe

Gruß
Udo
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D einfache Quizfrage programmieren Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben