Wie man lange lange druckt

Lesezeit: 4 Minuten

Benutzeravatar von Carlos
Carlos

Ich mache ein Programm, das PI annähert, und ich versuche, Long Long zu verwenden, aber es funktioniert nicht. Hier ist der Code

#include<stdio.h>
#include<math.h>
typedef long long num;
main(){
    num pi;
    pi=0;
    num e, n;
    scanf("%d", &n);
    for(e=0; 1;e++){
      pi += ((pow((-1.0),e))/(2.0*e+1.0));
      if(e%n==0)
        printf("%15lld -> %1.16lld\n",e, 4*pi);
      //printf("%lld\n",4*pi);
    }
}

  • Ich vermute, dein Problem liegt eher an der scanf als das printf.

    – Nemo

    19. Juni 2011 um 2:41 Uhr

  • pow((-1.0),e) würde viel besser ausgedrückt werden als e % 2 ? 1 : -1

    – phuklv

    29. Dezember 2017 um 10:36 Uhr

Benutzeravatar von karadoc
karadoc

%lld ist der C99-Standardweg, aber das funktioniert nicht auf dem Compiler, den ich verwende (mingw32-gcc v4.6.0). Der Weg, es auf diesem Compiler zu tun, ist: %I64d

Versuchen Sie also Folgendes:

if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);

und

scanf("%I64d", &n);

Die einzige Möglichkeit, die ich kenne, um dies auf vollständig portierbare Weise zu tun, besteht darin, die Definitionen in zu verwenden <inttypes.h>.

In deinem Fall sähe das so aus:

scanf("%"SCNd64"", &n);
//...    
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);

Es ist wirklich sehr hässlich … aber zumindest ist es tragbar.

  • Hier ist nicht Ihr Compiler, sondern Ihre C-Bibliothek zuständig. Sie verwenden die Microsoft C-Bibliothek, die nicht unterstützt wird %lldwas ein C99-Feature ist (obwohl es so ist inttypes.h).

    – Café

    20. Juni 2011 um 2:59 Uhr

  • Genauer gesagt ist es msvcrt.dll, die alte (ca. 1998) Version der C-Standardbibliothek, die ursprünglich für VC++ 6.0 geschrieben wurde und aus Gründen der Abwärtskompatibilität mit Windows ausgeliefert wird. MinGW verwendet diese alte Version, weil das die einzige ist, die mit Windows ausgeliefert wird. Aber modernes VC++-Laufzeithandle %lld richtig.

    – Pavel Minaev

    16. September 2016 um 1:36 Uhr

  • Visual C++ 2013 scheint das %lld-Formatelement zu unterstützen

    – Benutzer1741137

    3. Mai 2017 um 17:38 Uhr

  • @PavelMinaev msvcrt.dll, das mit Windows geliefert wird, ist nicht uralt.

    – Paul P

    18. Mai 2017 um 18:19 Uhr

  • Es wurde gepatcht, sicher, aber ich habe seit den Tagen von VC++ 6.0 nichts von Aktualisierungen seiner tatsächlichen Funktionen gehört.

    – Pavel Minaev

    19. Mai 2017 um 0:26 Uhr

  • Dein scanf() Aussage verwenden muss %lld zu.
  • Ihre Schleife hat keine Beendigungsbedingung.
  • Der Ausdruck enthält viel zu viele Klammern und viel zu wenig Leerzeichen

    pi += pow(-1.0, e) / (2.0*e + 1.0);
    
  • Sie addieren eins bei der ersten Iteration der Schleife und danach null zum Wert von ‘pi’; dies ändert den Wert nicht viel.
  • Sie sollten einen expliziten Rückgabetyp von verwenden int zum main().
  • Im Großen und Ganzen ist es am besten zu spezifizieren int main(void) wenn es seine Argumente ignoriert, obwohl das weniger eine kategorische Aussage ist als der Rest.
  • Ich mag die in C99 gewährte ausdrückliche Lizenz nicht, die Rückkehr vom Ende wegzulassen main() und benutze es nicht selbst; Ich schreibe return 0; explizit sein.

Ich denke, der gesamte Algorithmus ist zweifelhaft, wenn er verwendet wird long long; der Datentyp sollte wahrscheinlich ähnlicher sein long double (mit %Lf für die scanf() formatieren und evtl %19.16Lf für die printf() Formate.

Benutzeravatar von Vinicius Kamakura
Vinicius Kamakura

Zunächst einmal steht %d für a int

So %1.16lld macht keinen Sinn, weil %d eine ganze Zahl ist

Diese Typedef, die Sie machen, ist auch unnötig, verwenden Sie den Typ direkt, macht einen viel besser lesbaren Code.

Was Sie verwenden möchten, ist der Typ doubleum pi zu berechnen und dann zu verwenden %f oder %1.16f.

  • Es ist nicht wirklich “illegal” … es ist MSVC-spezifisch, denke ich.

    – Benutzer541686

    19. Juni 2011 um 2:41 Uhr


  • Falsch. Lies das Spezifikation für printf. %lld genau so druckt man a long long. (Natürlich die 1.16 kann nicht das tun, was Sie wollen … Aber es ist vollkommen gültig. Es bedeutet, eine minimale Feldbreite von 1 zu verwenden und 16 Ziffern zu drucken.)

    – Nemo

    19. Juni 2011 um 2:44 Uhr


  • @Mehrdad Du meinst %lld? Es ist in C99 7.19.6.1 spezifiziert.

    – Pascal Cuoq

    19. Juni 2011 um 2:45 Uhr

  • @Pascal: Oh, ich hatte keine Ahnung, noch besser damals. @hexa: Entschuldigung, ich bezog mich auf lldkeine Dezimalstellen … Ich dachte, das meinst du, meine Güte.

    – Benutzer541686

    19. Juni 2011 um 2:46 Uhr


  • MSVC verwendet ein Format wie z %I64d oder %lld für 64bit long long Formate.

    – Jonathan Leffler

    19. Juni 2011 um 3:50 Uhr


Benutzeravatar von Atul Kumar
Atul Kumar

    // acos(0.0) will return value of pi/2, inverse of cos(0) is pi/2 
    double pi = 2 * acos(0.0);
    int n; // upto 6 digit
    scanf("%d",&n); //precision with which you want the value of pi
    printf("%.*lf\n",n,pi); // * will get replaced by n which is the required precision

1411810cookie-checkWie man lange lange druckt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy