Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » modula mit long / double

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 <
000
21.09.2007, 09:08 Uhr
~hanneshoch3
Gast


Hallo!
Ich bin noch ziemlich neu in C, aber hab mich schon eingearbeitet.Nun hab ich ein programm geschreiben, dass mir spezielle zahlen berechnet( ich glaub nicht das ihr a bundante bzw leich abundanate zahlen kennt:-)).Aber sobald ich double nehm statt long hab ich kein modula mehr, aber ich muss zwingend prüfen ob eine Zahl eine Ganzzahl ist.Hier der Code:


Code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
long von;
long bis;
long i;
long j;
long half;
long sof;
main()
{
/*  input  */
printf("Bitte geben sie an, von wo bis wo analysiert werden soll!");
printf("\nVon?");
scanf("%d",&von);
printf("\nBis?");
scanf("%d",&bis);
/*   checking if i is abundant  */
for(i=von;i<bis+1;i++)
{
  sof=0; /*  sof=sum of factors  */
  half=i/2;
  for(j=1;j<half+1;j++)
  {
   if(i%j==0)
   {
    sof=sof+j;
   }
  }
  if(sof==i+1)
  {
   printf("\n%d",i);
  }
  if(i%10000==0)
  {
   printf("\nMomentan bei %d",i);
  }
}
printf("\n");
}




kann mir wer helfen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.09.2007, 09:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Bei double hast du immer das problem, das du "genauigkeit" verlierst. Für solche Spielchen musst du schon im ganzzahlenbereich bleiben...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.09.2007, 15:04 Uhr
~hanneshoch3
Gast



Zitat von Windalf:
Bei double hast du immer das problem, das du "genauigkeit" verlierst. Für solche Spielchen musst du schon im ganzzahlenbereich bleiben...


Soweit ich weiß ist double doch genauer als long, oder nicht?
Hab jetzt nme lösung gefunden:


Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double von;
double bis;
double i;
double j;
double half;
double sof;
double l;
double x;
main()
{
/*  input  */
printf("Bitte geben sie an, von wo bis wo analysiert werden soll!");
printf("\nVon?");
scanf("%lf",&von);
printf("\nBis?");
scanf("%lf",&bis);
/*   checking if i is abundant  */
for(i=von;i<bis+1;i++)
{
  sof=0; /*  sof=sum of factors  */
  half=i/2;
  for(j=1;j<half+1;j++)
  {
   l=i/j;
   if(l==(int)l)
   {
    sof=sof+j;
   }
  }
  if(sof==i+1)
  {
   printf("\n%lf",i);
  }
}
printf("\n");
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.09.2007, 15:35 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


double hat max 12 genaue stellen:

123.456789012xxxxxx
0.000000123456789012......

wo jetzt das komma steht ist egal.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.09.2007, 15:36 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Soweit ich weiß ist double doch genauer als long, oder nicht?


Nein double hat nur einen "größeren" Zahlenbereich bzw ist dynamischer. Aber hier treten nun mal rundungsfehler auf wie bei allen fließkommazahlen...

das ist alleine der tatsache geschuldet, dass eine Zahl im Rechner nie unendlich viele Bits hat...

Wenn ich den Zahlenraum hingegen genau einschränke und eine Bitstellung repräsentiert genau eine zahl dann bin ich "maximal" genau...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.09.2007, 22:21 Uhr
0xdeadbeef
Gott
(Operator)


Naja - man kann da schon verschiedene Funktionen schreiben, die modulo (bzw. sowas in der Art) für Fließkommazahlen definieren - nur ist das dann halt nicht mehr eindeutig. Um zu prüfen, ob eine Zahl eine Ganzzahl ist, halt nen Epsilon-Vergleich:

C++:
#include <algorithm>
#include <cmath>

bool epsilon_equal(double x, double y, double epsilon = 1e-6) {
  return std::abs(x - y) < epsilon;
}

bool is_integer(double x) {
  return epsilon_equal(x, std::trunc(x));
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: