Typ Long Double.

0

Witam. Mam pewien problem z typem long double, mianowicie typy float oraz double działają dobrze w poniższym kodzie wyświetlając prawidłowy wynik jeśli zmienimy ilość liczb znaczących odpowiednio dla każdego do max 6 i 15. Typ long double powinien działać przynajmniej przy takiej samej ilości liczb znaczących jak double, czyli np. tych 15, jednak co nie ustawie w poniższym kodzie, nawet mniejszą ilość cyfr niż 15, wyświetla wartość nieprawidłową np. -0.000000 lub 0.000000. Dlaczego tak się dzieje? Co robię źle?

#include<stdio.h>

int main(void)

{
	long double a, b;
	b = 2.0e15 + 1.0;
	a = b - 2.0e15;
	printf("%lf", a);
	getch();
	return 0;
}
0

%lf to double (long float), chcesz raczej %Lf. man sprintf FTW!

0

Z long double w ogole jest problem, bo jest on rożnie implementowany. Wg standardu powinien mieć poczwórną precyzję (quadruple precision - 16 bajtów) a zwykle ma potrojną (triple precision - 12 bajtów).

0

Dzięki, wszystko działa już jak należy. Mam jeszcze jedno pytanie, mianowicie sprawdzam w kompilatorze ile zajmują typy dobule i long double i otrzymuję wyniki odpowiednio 8 bajtów i 10 bajtów. Z tego by wynikało, że typ long double potrafi wyświetlić prawidłowy wynik z większą ilością liczb znaczących. Jednak long double podaje prawidłowy wynik tak jak typ double przy max. 15 liczbach znaczących. Np. przy 16 już wyświetla 0.0000000. Z czego to wynika? Czy może ja gdzieś popełniłem błąd w swoim rozumowaniu?

0

Czy jest ktoś w stanie udzielić mi odpowiedzi na wyżej postawione pytanie?

1
olek1 napisał(a)

Czy jest ktoś w stanie udzielić mi odpowiedzi na wyżej postawione pytanie?

już Shalom napisał że implementacja liczb jest różna. Tak naprawde nawet implementacje liczb int też bywają różne. ;)

Przyczyny są wszędzie, od preprocesora przez kompilator, czasem system operacyjny, aż po sam procesor. Nawet czasem zależne od typu instrukcji ;)

Trzeba przeglądnać kupe dokumentacji.

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