logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] C jak wyświetlić double z 15 miejscami po przecinku w printf i fprintf?

Magdalena_Anna 28 Lis 2012 23:02 9822 13
REKLAMA
  • #1 11587483
    Magdalena_Anna
    Poziom 9  
    Posty: 21
    Ocena: 7
    Mam taki program:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Używam w nim zmiennych double czyli podwójnej precyzji maszynowej (15 cyfr znaczących). Problem jest taki, że wyświetla mi się tylko 6 miejsc po przecinku... Próbowałam do scanf i printf dodać "%.15lf\n" ale to nie daje żadnego efektu... W jaki sposób zrobię więcej miejsc po przecinku?

    Proszę umieszczać kod w znacznikach syntax. Opcja Listing kodu. [adamas_nt]
  • REKLAMA
  • Pomocny post
    #2 11587941
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    1. printf, fprintf, etc, działają bez problemu gdy podamy im ile mają wyświetlić miejsc po przecinku. Zmodyfikuj program i wklej go, widocznie źle to robisz.
    2. W funkcjach printf i pochodnych %f samo w sobie przyjmuje double jako parametr, nie a potrzeby dopisywać l.
    3. scanf i podobne nie przyjmują informacji o ilości cyfr jakie miałyby sparsować.

    Polecam baczne (chociaż raz prze)czytanie dokumentacji. Link

    Pozdrawiam,
    GSM
  • #3 11588919
    Magdalena_Anna
    Poziom 9  
    Posty: 21
    Ocena: 7
    Działa. Dziękuję za pomoc :)
    problem mam jeszcze z tym
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    chciała bym w pętli for dodać warunek by dla e<=10^-12 pętla się zatrzymała. Próbowałam z if else ale nie chce mi się skompilować...

    edit:
    doszłam do czegoś takiego
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    jest już prawie ok, ale podaje mi o jedną wartość za dużo... co może powodować taki błąd?
  • #4 11591148
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    GSM napisał:
    1. printf, fprintf, etc, działają bez problemu gdy podamy im ile mają wyświetlić miejsc po przecinku. Zmodyfikuj program i wklej go, widocznie źle to robisz.
    2. W funkcjach printf i pochodnych %f samo w sobie przyjmuje double jako parametr, nie a potrzeby dopisywać l.
    3. scanf i podobne nie przyjmują informacji o ilości cyfr jakie miałyby sparsować.

    Polecam baczne (chociaż raz prze)czytanie dokumentacji. Link

    Pozdrawiam,
    GSM


    Zgodnie z podanym linkiem punkty 2 i 3 nie są prawdziwe.
  • REKLAMA
  • #5 11592171
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Magdalena_Anna napisał:
    Próbowałam z if else ale nie chce mi się skompilować...

    Proszę takie problemy zawsze ilustrować przykładem kodu, który to rzekomo nie działa. Czy chodzi może o problem z zapisem wykładniczym?
    Drobna uwaga, pętlą for wylatujesz poza tablicę, 31 iteracji a tablica t ma 30 pól.
    Do wychodzenia z pętli służy break.

    krru napisał:
    Zgodnie z podanym linkiem punkty 2 i 3 nie są prawdziwe.

    Co do scanf, pamięć zawiodła, pomyliłem się, ale co do printf, proszę jaśniej.
    Tabela specifier:
    Cytat:

    f ; Decimal floating point, lowercase

    Tabela length, kolumny length oraz specifiers dla 'f':
    Cytat:

    (none) ; double
  • #6 11592998
    Magdalena_Anna
    Poziom 9  
    Posty: 21
    Ocena: 7
    GSM napisał:
    Magdalena_Anna napisał:
    Próbowałam z if else ale nie chce mi się skompilować...

    Proszę takie problemy zawsze ilustrować przykładem kodu, który to rzekomo nie działa. Czy chodzi może o problem z zapisem wykładniczym?
    Drobna uwaga, pętlą for wylatujesz poza tablicę, 31 iteracji a tablica t ma 30 pól.
    Do wychodzenia z pętli służy break.


    Gdy użyłam break po pierwszym powtórzeniu kończyło pętle nie spełniając warunku.

    Problem mam teraz taki: do obliczeń potrzebuje wyrazu z tablicy (np. 12-t[i]), gdy biorę scanf("%f", &i) program się kompiluje, pyta o wartość i, gdy i=0 coś liczy ale dla i>0 jest błąd programu. Próbowałam także z scanf("%f", &t[i]) pytało o t[i] gdy podałam np. 4 to brało właśnie 4 zamiast odpowiedniej wartości z tablicy...
    Ze wszystkim poradziłam sobie ale na to nie mam pomysłu...
    Jak rozwiązać ten problem?
  • REKLAMA
  • #7 11593577
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Proszę wkleić zmodyfikowany kod programu, oraz listę błędów jakie się pojawiają. Nikt chyba nie ma ochoty wróżyć co tam jest nie tak.
    Skoro wychodził z pętli za wcześnie znaczy, że warunek w if-e przed break-iem był błędny...
    Takie próbowanie do nikąd nie prowadzi! Najlepiej byłoby rozpisać sobie na kartce założenia jakie ma spełniać program, potem rozpisać sobie w najprostszy sposób algorytm jaki ma zrealizować, a dopiero potem pisać program.
    Sposób niezawodny, działa przy dużych programach to i przy małych zadziała.

    Pozdrawiam,
    GSM
  • #8 11595593
    Magdalena_Anna
    Poziom 9  
    Posty: 21
    Ocena: 7
    GSM napisał:
    Proszę wkleić zmodyfikowany kod programu, oraz listę błędów jakie się pojawiają.

    Przy wczytywaniu tego wyrazu tablicy bład wygląda w taki sposób "pogram przestał odpowiadać" więc chyba nie ma nad czym się rozwodzić...
    GSM napisał:
    Skoro wychodził z pętli za wcześnie znaczy, że warunek w if-e przed break-iem był błędny...
    Takie próbowanie do nikąd nie prowadzi! Najlepiej byłoby rozpisać sobie na kartce założenia jakie ma spełniać program, potem rozpisać sobie w najprostszy sposób algorytm jaki ma zrealizować, a dopiero potem pisać program.
    Sposób niezawodny, działa przy dużych programach to i przy małych zadziała.

    Co do tego to pisałam już jak rozwiązałam ten problem, jest nawet fragment kodu.
  • #9 11595727
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Magdalena_Anna napisał:
    więc chyba nie ma nad czym się rozwodzić...

    Ale tu już by się przydał pełen aktualny kod.
    Czy problem z wyjściem poza tablice został poprawiony (w OBU pętlach!)?
    Po co ktoś tu ma zgadywać skoro można za każdym razem wkleić aktualną wersje programu w post-a...

    To, że tamten problem został rozwiązany nie świadczy, że to dobry sposób sprawdzać pole minowe chodząc po nim...

    Pozdrawiam,
    GSM
  • #10 11598061
    Magdalena_Anna
    Poziom 9  
    Posty: 21
    Ocena: 7
    Proszę zajrzeć do postu nr 3 w tym temacie. W programie jest jeden for. Dodałam do postu poprawionego for-a z komentarzem że działa...

    GSM, nigdy nie miałeś tak by jakiś program ci przestał odpowiadać? Niekoniecznie ten który stworzyłeś?
    Problem z tablicą wygląda w następujący sposób:
    jest ten program który już znajduje się w tym temacie i pomiędzy for a fclose jest
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    przy uruchomieniu dla i=0 wyświetla jakąś liczbę b która nie jest prawidłowym wynikiem, dla i>0 wyskakuje program przestał odpowiadać.
    Druga wersja wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    po wprowadzeniu z klawiatury t[i]=4 otrzymałam b=9 mimo że w tablicy na tym miejscu nie znajduje się liczba 4.

    Mam nadzieję że teraz wystarczająco jasno opisałam swój problem. Jeśli nadal będziesz miał problemy ze zrozumieniem mogę jeszcze raz wytłumaczyć.
    Jeszcze jedno. W tym wypadku problem brzmi: w jaki sposób wprowadzić do działania liczbę z tablicy by otrzymać poprawny wynik?

    Pozdrawiam
  • #11 11599519
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Magdalena_Anna napisał:
    GSM, nigdy nie miałeś tak by jakiś program ci przestał odpowiadać? Niekoniecznie ten który stworzyłeś?

    Jasne, że się tak zdarzało, ale pośrednich powodów takiego zachowania może być multum.

    W pierwszym fragmencie błąd to użycie %f w scanf, a argumentem jest wskaźnik do int-a a nie float-a, nie wiem co chcesz przez to osiągnąć.

    Magdalena_Anna napisał:
    po wprowadzeniu z klawiatury t=4 otrzymałam b=9

    Poprawnie...
    Magdalena_Anna napisał:
    mimo że w tablicy na tym miejscu nie znajduje się liczba 4.

    ...nie w miejscu o indeksie [i]i
    znajduje się przecież liczba 4, scanf ją tam umieścił po wprowadzeniu z klawiatury...

    Magdalena_Anna napisał:
    w jaki sposób wprowadzić do działania liczbę z tablicy by otrzymać poprawny wynik?

    W taki jak to robisz, tj. b=5+t$$i$$; dobrze korzysta z tablicy.

    Napisz dokładnie, w punktach co ten program ma robić, bo to tak wszystko w strzępkach jest.

    Pozdrawiam,
    GSM
  • REKLAMA
  • #12 11599933
    Magdalena_Anna
    Poziom 9  
    Posty: 21
    Ocena: 7
    z pliku wczytuje liczby do tablicy i mam dzialanie np. b=5+t[i]. w zależności na czym skończy się for będzie inne t[i] i dlatego chce wprowadzić np. t[5] z klawiatury
  • #13 11602236
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Magdalena_Anna napisał:
    w zależności na czym skończy się for będzie inne t[i]

    Rozwiń to proszę.
    Program wczytuje ileś linii wartości z pliku tekstowego i dla wszystkich po kolei oblicza wartość równania, to co ty tu jeszcze chcesz wprowadzać?

    Pozdrawiam,
    GSM

    P.S.
    Czemu twoje opisy i odpowiedzi są tak lapidarne? W ten sposób nie dajesz sobie pomóc...
    Jeśli ci się spieszy to w ten sposób osiągasz przeciwny efekt.
  • #14 11602738
    Magdalena_Anna
    Poziom 9  
    Posty: 21
    Ocena: 7
    Po prostu wyznaję zasadę krótko i na temat a nie lania wody...
    Program liczy pierwiastki metodą Newtona-Raphsona. W pliku mam wartości x_k+1 (http://pl.wikipedia.org/wiki/Metoda_Newtona), w pętli mam warunek przerwania pętli (warunek z epsilonem-to co jest w linku), następnie to co z czym mam problem-błąd względny [(wynik dokładny-x_k+1 przy przerwaniu warunku)/wynik dokładny]. W zależności od x_k w wyliczaniu błedu mam inną wartość x_k+1 którą muszę wczytać z tablicy.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    wersja do której doszłam-niestety tutaj do wyliczeniu błędu używam całej tablicy
    jeśli chcesz to pod spodem jest część programu wyliczająca x_k+1

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ Użytkownik ma problem z wyświetlaniem liczb typu double w programie C, gdzie domyślnie printf i fprintf pokazują tylko 6 miejsc po przecinku. Otrzymał pomoc w postaci wskazówek dotyczących użycia formatu "%.15lf" w printf oraz wyjaśnienia, że scanf nie obsługuje specyfikacji miejsc po przecinku. W dalszej części dyskusji użytkownik zmagał się z błędami przy wczytywaniu danych z pliku oraz z warunkami w pętli for, co prowadziło do problemów z dostępem do tablicy. Użytkownik został zachęcony do zamieszczania pełnych wersji kodu oraz do dokładnego opisywania problemów, co ułatwiłoby uzyskanie pomocy.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA