[C] Iloczyn skalarny dwóch wektorów

zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Iloczyn skalarny dwóch wektorów

Post autor: zdzicho0 »

Mam dwa wektory:

Kod: Zaznacz cały

X = [2.718281828; -3.141592654; 1.414213562; 0.5772156649; 0.3010299957];
Y = [  1486.2497;  878366.9879;   -22.37492;  4773714.647;  0.000185049];
Chce obliczyć iloczyn skalarny, trzeba użyć pojedynczej i podwójnej precyzji, czyli float i double i porównać z prawidłową wartością (dokładność do 7miu miejsc dziesiętnych) \(\displaystyle{ 1.006571_{10}-9}\)

Kod: Zaznacz cały

void IloczynSkalarnyFloat()
{
    printf ("FLOAT
");
    float a1 = 2.718281828, b1 = -3.141592654, c1 = 1.414213562, d1 = 0.5772156649, e1 = 0.3010299957;
    float a2 = 1486.2497, b2 = 878366.9879, c2 = -22.37492, d2 = 4773714.647, e2 = 0.000185049;
    float IloczynSkalarnyFloat = a1*a2 + b1*b2 + c1*c2 + d1*d2 + e1*e2;
    float iloczyn2 = e1*e2 + d1*d2 + c1*c2 + b1*b2 + a1*a2;

    printf ("Iloczyn skalarny FLOAT = %G
", IloczynSkalarnyFloat);
}

void IloczynSkalarnyDouble()
{
    printf ("DOUBLE
");
    double a1 = 2.718281828, b1 = -3.141592654, c1 = 1.414213562, d1 = 0.5772156649, e1 = 0.3010299957;
    double a2 = 1486.2497, b2 = 878366.9879, c2 = -22.37492, d2 = 4773714.647, e2 = 0.000185049;
    double IloczynSkalarnyDouble = a1*a2 + b1*b2 + c1*c2 + d1*d2 + e1*e2;

    printf ("Iloczyn skalarny DOUBLE = %G
", IloczynSkalarnyDouble);
}
Wychodzą niepoprawne wyniki. Prosiłbym o poprawę.
Ostatnio zmieniony 20 paź 2013, o 14:08 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C] Iloczyn skalarny dwóch wektorów

Post autor: Ser Cubus »

float obsługuje chyba tylko 7 miejsc po przecinku więc masz duże błędu przy mnożeniu, może o to chodzi?

I jeszcze jedna uwaga, Twoje funkcje powinny przyjmować liczby jako argumenty
zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Iloczyn skalarny dwóch wektorów

Post autor: zdzicho0 »

To nie jest gotowy program i będzie przyjmował jako argumenty. Narazie chce tylko rozwiązać i zrozumieć problem i co źle robię, a przejrzystość kodu i inne szczegóły potem.

Kolejna próba, np.:

Kod: Zaznacz cały


    float IloczynSkalarnyFloat = a1*a2 + b1*b2 + c1*c2 + d1*d2 + e1*e2;

daje zupełnie inny wynik, niż:

Kod: Zaznacz cały


 float a = a1*a2, b = b1*b2, c=c1*c2, d=d1*d2, e=e1*e2;
    float iloczyn3 = a+b+c+d+e;

Czy wyświetlanie jest poprawne? Double także daje zupełnie inne wyniki. Co jest nie tak ?
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C] Iloczyn skalarny dwóch wektorów

Post autor: Ser Cubus »



\(\displaystyle{ 2.718281828}\) czyta jako
\(\displaystyle{ 2.71828}\)

z powodu ograniczenia zakresu, tego nie przeskoczysz. Takie wyniki będą na floatach i są błędne, ponieważ float nie jest typem danych to tak dokładnych obliczeń. Różnice są normalne i należało się ich spodziewać
ODPOWIEDZ