Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 paź 2024, o 18:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 10 sie 2012, o 20:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Witam,
Mam kilka pytań odnośnie liczb zmienno przeciekowych.

Załóżmy, że zdefinujemy sobie pierwiastek z 5
#define sqrt5 2.23606797749979
i teraz pomnożymy to przez np.2
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Rozumiem, że w obu przypadkach wynik będzie równy 4?

Czy jest jakaś możliwość, aby zmienna b przyjęła wynik w postaci zmiennoprzecinkowej?


//Bardzo proszę nie offtopicować i nie pisać, że robie źlę i nie powinno się używać liczb zmiennoprzecinkowych w taki sposób. tylko w sposób jaki jest opisany w książce(czyli na liczbach całkowitych)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2012, o 20:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

jest możliwość , ale jest zasobożerna używając bibliotek matematycznych
niemniej nie korzystałem z nich więc moje informację mogą być niemiarodajne

oczywiście jeśli kolega uważa za ot to zaraz usunę , bo z brakiem samokrytyki się nie dyskutuje .
bo i niby jak z uint zrobić przecinek ?? użyj float .. ale jak pisałem AVR nie potrafi operować bezpośrednio na takich liczbach więc
koniecznością jest uzycie bibliotek matematycznych

zresztą ja się nie znam skoro wynika z mojego postu że robisz źle .

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2012, o 20:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

SunRiver napisał(a):
jest możliwość , ale jest zasobożerna używając bibliotek matematycznych

Mógłbyś to nieco przybliżyć?

Dodając nagłówek <math.h>
dalej zmienna b wynosi 4 ;/ (przynajmniej w symulatorze)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2012, o 20:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

jak dodałem wyżej z uint nie zrobisz zmiennoprzecinkowej musisz użyć typu float
ale operacje na tym typie wprost nie są możliwe na AVR ze względu na brak rozkazów
na poziomie maszynowym.

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2012, o 20:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Trochę się pomieszałem i piszę o czym innym, a sam chcę czegoś innego :D

Wynik, ma być liczbą całkowitą.
Natomiast chcę wiedzieć w jaki sposób zostanie obliczona.

Zmodyfikujmy nieco naszą stałą:
#define stala 2.93606797749979

uint8_t wynik;
wynik = stala*2;
Rozumiem, że teraz wynik będzie wynosił 5? (zostało to obliczone na etapie kompilacji).


Ale zróbmy taki trik.
Mamy zmienną (również całkowitą)
uint8_t zmiena;

I teraz ta zmienna będzie wzrastała wraz z kliknięciem klawisza

Taki kod;
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Teraz już wynik nie może być policzony na etapie kompilacji..

Czy w takim wypadku dalej zmienna będzie wynosiła 5?

Z jaką dokładnością wtedy liczona jest ta zmienna wynik?
Bo przecież jeśli zdefiniowalibyśmy tą stałą np. ze 100 miejscami po przecinku to chyba i tak przy kompilowaniu programu będzie ona skracana (do iluśtam miejsc po przecinku a nie do 100?) mam rację?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2012, o 20:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

na oko chyba zaokrągli tą twoja stałą do 3 i tyle

nie symulowałem tego i nie chce mi się sprawdzać

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2012, o 22:23 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

xamrex napisał(a):
Witam,
Mam kilka pytań odnośnie liczb zmienno przeciekowych.

Załóżmy, że zdefinujemy sobie pierwiastek z 5
#define sqrt5 2.23606797749979
i teraz pomnożymy to przez np.2
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Rozumiem, że w obu przypadkach wynik będzie równy 4?

Czy jest jakaś możliwość, aby zmienna b przyjęła wynik w postaci zmiennoprzecinkowej?



Ja też chyba totalnie nie zrozumiałem pytania więc jak coś to się nie denerwuj - ale czy nie powinieneś tego robić na typach float jak już się upierasz na liczby zmiennoprzecinkowe - czyli tak :


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ja nie wiem w ogóle jak ty się możesz spodziewać JAKIEGOKOLWIEK innego wyniku niż 4 w przypadku tych swoich przykładów - toż skoro działasz na liczbach całkowitych to, to co po przecinku idzie w KOSMOS :(

A jeśli już chciałbyś koniecznie obliczyć to na całkowitych to po lekkim zmodyfikowaniu stałej czyli zwiększeniu jak sam zauważyłeś bo pierwiastek z pięciu * 2 nigdy nie byłby równy przecież 5. To jak zrobisz to co niżej - już spokojnie otrzymasz 5 czyli wszystko będzie prawidłowo zaokrąglane - ale jak widzisz działamy TYLKO na liczbach całkowitych ;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


może więc to da ci coś do myślenia ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO