Soru Uzun uzun baskı nasıl


Ben PI ve uzun süre kullanmaya çalışıyorum bir program yapıyorum, ama çalışmıyor. İşte kod

#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);
    }
}

42
2018-06-19 02:36


Menşei


Sanırım problemin daha çok scanf den printf. - Nemo
pow((-1.0),e) çok daha iyi ifade edilir e % 2 ? 1 : -1 - phuclv


Cevaplar:


%lld standart C99 yoludur, ancak kullandığım derleyicide çalışmaz (mingw32-gcc v4.6.0). Bu derleyicide bunu yapmanın yolu: %I64d

Bu yüzden şunu deneyin:

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

ve

scanf("%I64d", &n);

Bunu tamamen taşınabilir bir şekilde yapmak için bildiğim tek yol, tanımların <inttypes.h>.

Senin durumunda, şöyle görünecekti:

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

Gerçekten çok çirkin ... ama en azından taşınabilir.


54
2018-06-19 03:49



Derleyiciniz değil, burada sorumlu olan C kütüphaneniz. Desteklemeyen Microsoft C kütüphanesini kullanıyorsunuz %lldC99 özelliği olan inttypes.h). - caf
Daha spesifik olmak gerekirse, başlangıçta VC ++ 6.0 için yazılmış olan C standart kütüphanesinin eski (yaklaşık 1998) sürümü olan ve geriye dönük uyumluluk amacıyla Windows ile birlikte gelen msvcrt.dll dosyasıdır. MinGW bu eski sürümü kullanır, çünkü Windows ile kutudan çıkan tek şey budur. Ama modern VC ++ çalışma zamanı kolu %lld uygun şekilde. - Pavel Minaev
Visual C ++ 2013,% lld biçimindeki öğeyi destekliyor gibi görünüyor - user1741137
Windows ile birlikte gelen @PavelMinaev msvcrt.dll antik değil. - Pavel
Tamamen yandı, ama VC ++ 6.0 gününden beri gerçek özelliklerinde herhangi bir güncelleme duymadım. - Pavel Minaev


  • Sizin scanf() deyimin kullanılması gerekiyor %lld çok.
  • Döngünün bir sonlandırma koşulu yok.
  • İfadede çok fazla parantez ve çok fazla boşluk var

    pi += pow(-1.0, e) / (2.0*e + 1.0);
    
  • Döngünün ilk yinelemesine bir tane eklersiniz ve daha sonra sıfır değerine sıfır eklersiniz; Bu değeri çok değiştirmez.
  • Açık bir dönüş türü kullanmalısınız int için main().
  • Genel olarak, belirtmek en iyisidir int main(void) argümanlarını görmezden gelse de, bu geri kalanından daha az kategorik bir ifadedir.
  • C99’da verilen açık lisanstan hoşlanmıyorum. main() ve kullanma kendim; yazıyorum return 0; açık olmak.

Bence tüm algoritma kullanılarak yazıldığında şüpheli. long long; veri tipi muhtemelen daha fazla olmalı long double (ile %Lf için scanf() format ve belki %19.16Lf için printf() biçimleri.


2
2018-06-19 03:51





    double pi = 2 * acos(0.0);
    int n;
    scanf("%d",&n); //precision with which you want the value of pi
    printf("%.*lf\n",n,pi);

2
2017-12-29 10:27



Bu kod pasajı bir çözüm olsa da, bir açıklama da dahil olmak üzere yayınınızın kalitesini iyileştirmeye yardımcı olur. Gelecekte okuyucular için soruyu yanıtladığınızı ve bu kişilerin kod önerilerinizin nedenini bilmediğini unutmayın. - Rahul Gupta


Her şeyden önce,% d bir int

Yani %1.16lld hiçbir anlam ifade etmiyor çünkü% d bir tam sayıdır

Yaptığınız yazım hatası da gereksizdir, ilerideki tipi kullanın, çok daha okunabilir bir kod hazırlayın.

Ne kullanmak istersin, tip doublepi hesaplamak için ve sonra kullanarak %f veya %1.16f.


-1
2018-06-19 02:40



Gerçekten "yasadışı" değil ... MSVC'ye özgü, bence. - Mehrdad
@Mehrdad Tamsayı sayıları ondalık basamaklara sahip olduğundan beri? - Vinicius Kamakura
Yanlış. Okumak printf için spec. %lld tam olarak nasıl yazdırdığınız long long. (Elbette, 1.16 istediğini yapamayabilirsin ... Ama bu kesinlikle geçerli. Minimum alan genişliği 1 ve 16 basamağı basmak demektir.) - Nemo
@Mehrdad demek istiyorsun %lld? C99 7.19.6.1'de belirtilmiştir. - Pascal Cuoq
MSVC gibi bir format kullanır %I64d veya %lld 64-bit için long long biçimleri. - Jonathan Leffler