Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Liczba zmiennoprzecinkowa - Zapis i deklaracja

kingpin86 17 Gru 2015 14:31 996 7
  • #1 17 Gru 2015 14:31
    kingpin86
    Poziom 2  

    Witam.
    Szukałem i nigdzie nie znalazłem jak zadeklarować zmienną o wartości 21.290000.
    Korzystam z książki Stephena Prata "Język C. Szkoła programowania".
    Znajduje się tam ćwiczenie o treści:

    "Napisz program, który pobiera liczbę zmiennoprzecinkową i wyświetla ją najpierw w postaci ułamka dziesiętnego,a potem w notacji wykładniczej. Zastosuj następujący wzorzec dla danych wyjściowych:
    Podana liczba to 21.290000 lub 2.129000e+001."

    Na chwilę obecną wygląda to tak:

    long double a;

    printf("Podaj liczbe zmiennoprzecinkowa:\n");
    scanf("%lf",&a);

    printf("Ulamek dziesietny: %lf,\nUlamek w notacji wykladniczej: %e",a,a);

    Ułamek dziesiętny wychodzi "0.000000".
    Czy da się zadeklarować liczbę zmiennoprzecinkową dłuższą niż 6msc. po przecinku?

    Jestem na etapie początkowym co widać, więc proszę o pomoc bardziej doświadczonych w języku C kolegów. Dzięki.

    0 7
  • #2 17 Gru 2015 16:05
    Krzysztof Gustaw
    Poziom 23  

    Witam!
    Jeśli liczba jest zdefiniowana jako long double to formatka powinna być: "%Lf" (duże L). Tak przynajmniej jest w Pelles C.

    0
  • #3 17 Gru 2015 16:18
    kingpin86
    Poziom 2  

    Niestety efekt taki sam.

    0
  • #4 17 Gru 2015 16:41
    zniwus
    Poziom 5  

    Jak patrzę jest prawie dobrze, tylko %Ld i %Le powinno być przy scanf i printf.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 17 Gru 2015 17:35
    kingpin86
    Poziom 2  

    Niestety efekt jest taki:

    Liczba zmiennoprzecinkowa - Zapis i deklaracja

    Cały czas pokazuje 0.000000.

    Dziękuję za zainteresowanie :).

    0
  • #6 18 Gru 2015 12:07
    kinggustav
    Poziom 21  

    Nie mam niestety na czym tego sprawdzić, a dawno nie pisałem w c, ale czy rzeczywiście należy w scanf podawać &a? Moim zdaniem powinno tam być samo a. Jeżeli jest jak myślę to wczytujesz liczbę w zupełnie inne miejsce niż chciałeś.

    0
  • #7 18 Gru 2015 13:16
    zniwus
    Poziom 5  

    scanf wymaga wskaźnika (pointer), bo inaczej wartość argumentu została by skopiowana do ciała funkcji scanf i nie mógł by tej konkretnej zmiennej (w ciele main() -> long double a) nadpisać.
    Mam nadzieję że zrozumiale to napisałem.
    Poprawnie działanie:
    scanf kopiuje adres wskaźnika argumentu -> następnie nadpisuje wartość na którą pokazywał ten wskaźnik
    Powiedzmy sobie że nasza zmienna 'a' ma wartość 21.290000 i ma adres wskaźnika 0x7fffb51dca10
    scanf otrzymuje w argumencie wywołania funkcji nie 21.290000 tylko 0x7fffb51dca10,
    następnie kopiuje ten adres do ciała funkcji,
    następnie wykonuje swoje działania (czytanie wartości z deskryptora stdin),
    następnie na podstawie wskaźnika podanego w argumencie, nadpisuje wartość (pamięci) na którą wskazywał czyli nasze 'a'

    0
  • #8 18 Gru 2015 23:25
    Krawiec91
    Poziom 12  

    Jakiego kompilatora używasz?

    0