01-11-2017, 22:23
W funkcji func() następuje konwersja typu int na float, a funkcja zwraca unsigned long.
Dzielenie c/(float)b daje wynik przybliżony, coś w postaci 1.9999999, więc wynik potęgowania to 3.9999997,
a 6000*3.9999997=23999.9982.
Konwersja do long zwraca część całkowitą wyniku, czyli 23999.
A dla czego tak się dzieje, że w zależności gdzie zadeklarujesz, lub gdzie przypiszesz zmiennej z wartość, to otrzymujesz różne wyniki?
Jest to automatyczne rzutowanie typów zadeklarowanych zmiennych w zależności od tego, co kompilator uzna za stosowne. Kompilator konwertuje typy zawsze gdy jest to tylko możliwe i gdy już wie, że będzie dzielenie long przez float, bo użyłeś funkcji func(), to nie będzie rzutował c na float, bo wie że wyniki będą nieprawdziwe.
W normalnym kompilatorze powinno wyskoczyć ostrzeżenie, że wyniki będą przybliżone, chociaż pewnie GCC nie popełnił by tego błędu, bo inna jest kolejność kompilacji.
Dzielenie c/(float)b daje wynik przybliżony, coś w postaci 1.9999999, więc wynik potęgowania to 3.9999997,
a 6000*3.9999997=23999.9982.
Konwersja do long zwraca część całkowitą wyniku, czyli 23999.
A dla czego tak się dzieje, że w zależności gdzie zadeklarujesz, lub gdzie przypiszesz zmiennej z wartość, to otrzymujesz różne wyniki?
Jest to automatyczne rzutowanie typów zadeklarowanych zmiennych w zależności od tego, co kompilator uzna za stosowne. Kompilator konwertuje typy zawsze gdy jest to tylko możliwe i gdy już wie, że będzie dzielenie long przez float, bo użyłeś funkcji func(), to nie będzie rzutował c na float, bo wie że wyniki będą nieprawdziwe.
W normalnym kompilatorze powinno wyskoczyć ostrzeżenie, że wyniki będą przybliżone, chociaż pewnie GCC nie popełnił by tego błędu, bo inna jest kolejność kompilacji.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.