Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 33. Virtualrätsel (mal was gemeines)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
09.07.2003, 12:53 Uhr
virtual
Sexiest Bit alive
(Operator)


Angenommen, folgendes Programm benötigt auf einem Rechner 1 Sekunde:

C++:
int main()
{
  double x = 1e8;
  while( x > 0 )
  {
    --x;
  }
}


(Wie) ändert sich das Laufzeitverhalten, wenn das double durch ein float ersetzt wird? Begründe.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.07.2003, 13:43 Uhr
~0xdeadbeef
Gast


Plattformabhängig. Auf einem ia32 (x86-32) wird das Programm mit float statt double nie terminieren. 1e8 kann von einem float zwar gefasst werden, aber es passt nicht mehr vollständig in die Mantisse. Dementsprechend verändert --x den Wert des floats nicht, und er wird nie zu null.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.07.2003, 13:49 Uhr
virtual
Sexiest Bit alive
(Operator)


Genau. Und da du der erste bist, der so nett antwortet, für dich die ganz persönliche Zusatzaufgabe:

Zitat:

Schreibe obiges Porgramm so um, daß es mit float arbeitet und entweder in die Schleife geht oder aber die Aussagekräftige Aussage macht "Kann Schleife nicht ausführen, würde nie terminieren.


Nee, ist zu billig. Denn auf

C++:
if (x==x-1) { cout << "Kann..."<<endl; }


Kommst Du ja mit links. Deshalb besser:

Zitat:

Schreibe obiges Porgramm so um, daß es mit float arbeitet und ausgibt, ab welchen Startwert für x es zuverlässig arbeiten würde. Platformunabhängig, wenn möglich.


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 09.07.2003 um 13:51 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.07.2003, 14:29 Uhr
~0xdeadbeef
Gast


Hm. Also, mein erster Gedanke wär der hier:

C++:
int main() {
    float x=1,y,z;
    do {
        z=y;
        y=x;
        ++x;
    } while(x != y);

    printf("%f\n",z);

    while(z > 0) --z;
}


Allerdings spuckt der mir nur 16777215.0 aus. Ich habs ausprobiert, der höchste Wert, mit dem die Schleife noch terminiert, ist 16777218.0 - woran das liegt, kann ich mir aber nicht erklären - hast du ne Idee dazu?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.07.2003, 14:58 Uhr
virtual
Sexiest Bit alive
(Operator)


Hi,

also ich hätte es so gelöst:

C++:
#include <limits>
#include <iostream>

int main()
{
   std::cout<<(1ul<<std::numeric_limits<float>::digits)<<std::endl;
}


Wo eben 16777216 raus kommt (auf einer RS/6000). Direkt erklären kann ich mir es nicht. Aber vielleicht sind in dem Grenzbereich Addition und Subtraktion nicht symmetrisch. Das hier scheint diesen verdacht zu erhärten:

C++:
#include <stdio.h>

void dump_float(float f)
{
    unsigned char* c = (unsigned char*)&f;
    int i;
    printf("%10.10f: ", f);
    for(i=0; i<sizeof(f); ++i)
    {
        printf("%02x ", c[i]);
    }
    printf("\n");
}

int main()
{
    float f = 16777216.0;
    dump_float(f);
    f++; /* Scheoint nix zu verändern */
    dump_float(f);
    f--; /* Zu erwarten wäre ursprungswert, aber... */
    dump_float(f);
    f--; /* Normale subtraction */
    dump_float(f);
    f--;
    dump_float(f);
}


Ich denke mal, daß die FPU intern noch einige Stellen mit berechnet, die aber nicht über das register direkt ansprechbar sind.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.07.2003, 23:54 Uhr
Pablo
Supertux
(Operator)


Welcher Datentyp kann mehr Fließkommazahlen darstellen in C++, float oder double? Welcher benutzt wie viele bits oder benutzen beide die gleiche Mantisse (ich meine damit, gleich gross)?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.07.2003, 00:06 Uhr
~0xdeadbeef
Gast


Es gilt auf jeden Fall sizeof(long double) >= sizeof(double) >= sizeof(float), aber der Rest ist plattformabhängig. Um rauszufinden, wies bei dir ist, probier mal diesen Code:

C++:
main() {
    printf("long double: %d\ndouble: %d\nfloat: %d\n", sizeof(long double), sizeof(double), sizeof(float));
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.07.2003, 00:19 Uhr
Pablo
Supertux
(Operator)


Mein Ergebnis ist:
long double: 12
double: 8
float: 4

Aber wieso passt dann die Mantisse bei float nicht ganz, wie bei double? Müsste denn nicht umgekehrt sein, weil double mehr bits für die Mantisse braucht?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.07.2003, 07:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Also das hier gibt dir die Bits in der Mantisse zurück:

C++:
#include <limits>
#include <iostream>

int main()
{
   std::cout<<"Mantissen bits bei:"<<std::endl;
   std::cout<<"- float: "<<std::numeric_limits<float>::digits<<std::endl;
   std::cout<<"- double: "<<std::numeric_limits<double>::digits<<std::endl;
   std::cout<<"- long double: "<<std::numeric_limits<long double>::digits<<std::endl;
}


Abber leider habe ich Deinen letzte Frage nicht verstanden, Pablo. Was meinst Du?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.07.2003, 12:44 Uhr
Pablo
Supertux
(Operator)


0xdeadbeef sagt, dass wenn man float nimmt, dann rechnet die Schleife für immer, weil die Zahl nicht vollständig die Mantisse passt.

Wenn float wenige bytes als double braucht, wieso passt dann floats nicht vollstädnig in die Mantisse?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: