long double nie działa

0

Cześć, na podstawie kursu znalezionego w sieci utworzylem program którego zadaniem jest przetestowanie typu long double.
Niestety, nie działa. Efekt jest następujący:

j: 1
k: -0.000000
test: -0.000000

Kod programu

#include <stdio.h>

int main(void){

    int j;
    long double k = 0.1;
    long double test = 1.0;
    for(j=1;j!=10;j++){
        k+=0.1;
    }
    printf("j: %d\n", j/10);
    printf("k: %llf\n", k);
    printf("test: %llf\n", test);
    return 0;
}

Co jest nie tak?

//EDIT: PROBLEM ROZWIĄZANY:
dodaj -std=c11 lub -std=c99 w wywołaniu kompilatora, lub w opcjach projektu.

1

Spróbuj %Lf zamiast %llf

0

Próbowalem wcześniej, nic to nie dało.

1

To co robisz teraz to chyba UB. http://en.cppreference.com/w/c/io/fprintf @szweszwe ma rację, %Lf jest poprawnym formatem dla long double.

0
MarekR22 napisał(a):

używaj --Wall
http://melpon.org/wandbox/permlink/KEqRS8ksuIfqDS4k
http://melpon.org/wandbox/permlink/nfwVcWKEwj3wsuYK

Fajne narzędzie które mi podesłałeś - ale teraz jest jeszcze ciekawiej... pod powyższym linkiem oba programy działają tak samo a po przekopiowaniu do mojego kompilatora (codeblox w najnowszej wersji) efekt jest taki jak w pierwszym poście.

I nie do końca wiem co masz na myśli z --Wall

0

To mniej więcej oznacza undefined behavior. Może się zdarzyć wszystko.

1
kq napisał(a):

To co robisz teraz to chyba UB. http://en.cppreference.com/w/c/io/fprintf @szweszwe ma rację, %Lf jest poprawnym formatem dla long double.

C11 7.21.6.1/9:

If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

0

Dla uproszczenia zrobilem taki kod:

#include <stdio.h>

int main(void){

    long double k = 0.1;
    long double test = 1.0;

    printf("k: %Lf\n", k);
    printf("test: %Lf\n", test);
    return 0;
}

Zmienna k podaje bardzo dużą, kosmiczną wartość a test dalej -0.000000

Po dodaniu opcji -Wall

||=== Build file: "no target" in "no project" (compiler: unknown) ===|
C:\Users\Piotrek\Desktop\test\main.c||In function 'main':|
C:\Users\Piotrek\Desktop\test\main.c|8|warning: unknown conversion type character 'L' in format [-Wformat=]|
C:\Users\Piotrek\Desktop\test\main.c|8|warning: too many arguments for format [-Wformat-extra-args]|
C:\Users\Piotrek\Desktop\test\main.c|9|warning: unknown conversion type character 'L' in format [-Wformat=]|
C:\Users\Piotrek\Desktop\test\main.c|9|warning: too many arguments for format [-Wformat-extra-args]|
||=== Build finished: 0 error(s), 4 warning(s) (0 minute(s), 0 second(s)) ===|

Edit. Problem rozwiązany
Jak sparrow napisal w komentarzu pod tym postem:** dodaj -std=c11 lub -std=c99 w wywołaniu kompilatora, lub w opcjach projektu.**

1 użytkowników online, w tym zalogowanych: 0, gości: 1