zrób sobie unie: union dane { float f; unsigned int i; }; Zakładając, że float i uint mają ten sam rozmiar (sprawdź to) wpisując do float'a liczbe jaką chcesz, dostaniesz jej odwzorowanie bitowe w uint'cie. A dalej już jak wyżej.
wystarczy trochę poszukać w helpie: interesującymi Cię funkcjami są: _itoa, _ecvt, _fcvt, _qcvt z biblioteki stdlib.h
Konwersję z liczby całkowitej na string łatwo można Sobie zaimplementować, implementacje funkcji itoa() też są dostępna, wystarczy poszukać w sieci: [url=http://en.wikipedia.org/wiki/Itoa]i... Część po przecinku też można wydobyć za pomocą itoa() wystarczy pomnożyć wynik przez wielokrotność 10 i zapisać go do integer. Warto ogólnie operować na liczbach...
I mieć dużo flasha...
Jeśli chcesz, żeby zaokrąglał zamiast obcinać to do zmiennej float dodawaj 0,5 i następnie rzutuj.
Tu jest opis: [url=http://en.wikipedia.org/wiki/Stdint... Tabela porównawcza.
Ja mam identycznie i jest OK. Mam jeszcze jedno pytanie: czy masz włączoną optymalizację kodu w GCC?
Jest to domyślna "rozdzielczość" dla funkcji Serial.print(). Jeżeli chcesz więcej liczb po przecinku, to należy podać ile ich ma być np.[syntax=c] Serial.println(times, 6);[/syntax][url=https://www.arduino.cc/...
Tak się nie da niestety. Aby wołać funkcje kótre są w bootloaderze z alpikacji musisz mieć tablicę adresów tych funkcji w znanym sobie miejscu w pamięci (w tym że booloaderze). Np: [syntax=c] struct x; int func1(int, float); double func2(long long, double, float, struct x); /* * etc etc */ const struct { int (*func1)(int, float); double (*func2)(long...
Oj tam! Jeśli chce na float, to niech robi. Ja nie neguję. :) Dałem sobie chwilkę i przejrzałem Twój kod. Nic dziwnego, że masz kaszanę, skoro używasz do wyświetlenia tekstu z RAM procedury czytającej teksty z Flash. :) W procedurze LCD_WRITE_TXT zmień linię[syntax=c]mark = pgm_read_byte(&text[turn++]);[/synta... = text[turn++];[/syntax]...
Warto zainteresować się plikiem Makefile i jego budową, chociaż w większości przypadków ta wiedza się nie przydaje, ale jednak, jak widać po tym kodzie, trzeba czasem trochę pogrzebać. Cieszę się, że działa. Pozdrawiam
Zapewne zapomniałeś dodać jednej z bibliotek do opcji linkera. Możesz dodać jedną, zależnie której używasz (float/double/ldouble), lub wszystkie razem: #pragma comment(lib, "libfftw3-3.lib") #pragma comment(lib, "libfftw3f-3.lib") #pragma comment(lib, "libfftw3l-3.lib")
zamień: [syntax=c]w = x.numerator/x.denominator;[/syntax] na: [syntax=c]w = (float)x.numerator/x.denominator;[/synta... i najlepiej float na double
char wartosc sprintf odpada dla tak skromnego bufora, tymbardziej ze float/double jest w formacie. Niech ipaliwo wyjdzie z ułamkiem, to buffer overflow będzie murowany. Polecam albo skuteczne zwiększenie rozmiaru zmiennej "wartosc" (tak z dobrym zapasem - 64, 128 bajtów), albo bezpieczną wersję sprintf: funkcję _snprintf _snprintf(wartosc, sizeof(wartosc),...
Ok, to zrobiłem. O ile dobrze rozumiem, zmienna double jest nie potrzebna, wystarcza float tylko pojawia się kolejne pytanie: Gdy chce zadeklarować zmienną pisząc pseudokodem - suma=cena_paczki+cena_towaru żeby w dalszej części programu nie wykonywać już zadania (cena_paczki+cena_towaru)/dolar tylko suma/dolar jak muszę ją zadeklarować? Wystarczy suma=cena_paczki+cena_towaru;...
1.1 - 1.0 = 0.10000000000000009, czyli wynik odejmowania nie jest dokładnie równy 0.1. Przy porównywaniu liczb typu float czy double trzeba dopuścić jakiś margines błędu. [syntax=php]EPSILON = 0.0001 if (abs($x - $y - $z) < EPSILON) ...[/syntax] Zob.też "Comparing floats" w https://www.php.net/manual/en/language.t... i ew. https://pl.wikipedia.org/wiki/IEEE_754
Uwierz mi, że wszystko działa jak trzeba, tylko trzeba mieć świadomość różnic między float a double... Np. jak wezmę Twój przykład i zmienie double na float: volatile float f = 123.5434; Niby OK, ale... 123.5434 jest... liczbą typu double, więc faktycznie masz konwersje (ze względu na volatile). Jak dasz 123.5434 f (albo zrzutujesz na float), to już...
Czy przypadkiem K to nie INT, E to FLOAT, L to DOUBLE? Nie jestem pewny, ale czy obsługa float nie zależy też od CPU? https://obrazki.elektroda.pl/2103278700_...
Bez kodu ciezko cos powiedziec ale prawdopodobnie musisz sie pogodzic z takim wzrostem obietosci kodu, albo zoptymalizowac go tak by wyeliminwac takie liczby co prawie zawsze sie da....
Niestety o ile dobrze kojaże, w C mamy do dyspozycji tylko dwa typy zmiennych dla liczb zmiennoprzecinkowych - wspomniany float oraz double (8 bajtów, 15 miejsc po przecinku), w razie w long double, ale to nie to czego szukasz. Tak więc prostszego od float typu nie znajdziesz. Natomiast istnieje kilka innych rozwiązań dla liczb zmiennoprzecinkowych,...
A BTW na AVR nie istnieje typ double - dla scislosci istnieje, ale jest to to samo co float. Nie wiem jak avr-libc potraktuje double - czy tu nie bedzie jakis spiec.
[syntax=cpp]liczba = (ulamek/1000) + calkowita;[/syntax] ulamek/1000 - wynik będzie w int, a następnie będzie rzutowany na float, czyli stracisz część ułamkową. Wystarczy rzutować jedną z liczb na float, lub po prostu zapisać 1000 w postaci 1000F (F bo float). Jeśli wynik byłby double to wystarczyłoby 1000.0.
Z floatem jest troche więcej zabawy Owszem , ale jeśli to dotyczy kompilatora innego niż AVR-GCC.Po zmiennej typu bit poznaję , że przytoczona przez Ciebie funkcja dotyczy bardziej MCS-51 , a nie AVR , choć tych drugich oczywiście nie wyklucza. Wracając do meritum , czyli zamiany nieszczęsnego float na string , to gdyby tylko zajrzeć do pliku nagłówkowego...
1. Wielu programistów uważa, że float - to liczba rzeczywista. No i bardzo się mylą, z czego wynika mnóstwo kłopotów. Niedouctwo. Co masz na myśli? Float <-> Double?
Witam. Mam pytanie jak w tytule: Czy jest jakaś funkcja zamieniająca zmienną typu float lub double na zmienną typu int? Pozdrawiam. Generalnie , nie można zmienić typu zmiennej , do końca jej "istnienia". Poza tym , czy nie chodzi Ci czasem o przypisanie wartości ze zmiennej typu float,double , do zmiennej typu int :?: Poczytaj o rzutowaniu. Piotrek
1. do [u]int{8,16,32}_t są specjalne znaki formatujące dla printf() - jak poszukasz to znajdziesz. 2. Do konwertowania liczb całkowitych na string prościej użyć innych funkcji, które tyle nie zajmują (itoa() itp.) Do float i double też są takie funkcje. 3. Kompilator nie czepia się, że chce inny typ zmiennej, tylko że funkcja zignoruje dodatkowe specyfikatory...
Bo tam masz 23 a nie 230 - w funkcji pomiar() juz dzielisz wynik przez 10. Chyba zamiast: temp1=(double)ADCW; chciales zrobic: temp1+=(double)ADCW; BTW, na AVR double=float, a w tym przypadku w ogole obliczen zmiennopozycyjnych nie potrzebujesz, ale jesli masz miejsce i czas na nie to czemu nie :)
Co to są cyfry znaczące w zmiennych rzeczywistych? Szukam przykładów zmiennych float, double float i long double. Nie rozumiem też dlaczego w zmiennych całkowitych istnieją INT i UNSIGNET INT jeśli ich zakres pokrywa LONG INT
Opisywane zachowanie może być spowodowane zlinkowaniem z (alernatywnym) libc , która z powodów objętościowych nie ma pełnej obłsugi double/float (zresztą atof powinien zwrócić double, nie float). Sprawdź, czy twój kompilator/środowisko/biblioteki są prawidłowo skonfigurowane/użyte do pracy z float/double.
volatile nie jest gwarancją, że w/w dodawanie wykona się niepodzielnie, (mówimy 'atomowo'), zwłaszcza że operacja jest względnie długa. W ESP32 można użyć typu atomowego wprost np. atomic_ulong, ale nie ma takiego wsparcia dla float czy double m.in. dlatego, że operacje na float/double wykonywane są przez FPU.
Co znaczy "bardzo znacznie"? Podaj jakieś dane. Pamiętaj, że biblioteka standardowa na AVR implementuje tylko typ float, a double już nie. Standard mówi, że funkcje sin, cos, pow, atan2 i sqrt przyjmują i zwracają wartości typu double. Stąd na PC będziesz miał większą precyzję obliczeń. Spróbuj użyć funkcji z przyrostkiem f, np. sinf, cosf itp - te...
Odnośnie tablic chodziło mi jedynie o sposób deklaracji. Wiadomo, że deklaracja być musi, ale podczas dodawania do tablicy nie masz mechanizmu kontroli, czy dane nie wyszły poza zakres tablicy. Polecam nad tym pomyśleć :) Nagłówek. double loadit (FILE **f, float (*t)[100], float (*sinn)[100], float (*zaszum)[100])...
Float:=StrToFloat(String(PChar));
Zaokrąglenia w liczbach zmiennoprzecinkowych to normalna rzecz. Użyj double lub long double ze wszystkimi konsekwencjami używania takiej zmiennej ale raczej nie w AVR-GCC. Sprawdź przy użyciu sizeof, czy AVR-GCC, które masz faktycznie obsługuje double i long double bo może być tak, ze to jedno i to samo, jak kiedyś long i long long. Na ARM float reprezentowane...
Zgodnie z Gdzie dokładnie w tej dokumentacji to wyczytałeś? 64-bitowa liczba całkowita bez znaku ma 20 cyfr znaczących, więc nie wiem, jak chcesz ze zmiennoprzecinkowej wyciągnąć 40? W dokumentacji metody The precision parameter specifies the precision of the given value. It should be 7 or less for values of type float, 15 or less for values of type...
Problemem jest używanie na siłę typu double, tam gdzie nie jest to potrzebne. Normalna wersja sprintf z AVRlibc jest okrojona i float/double nie wspiera. Aby to działało trzeba zlikować program z biblioteką lipprintf. Ale po co, skoro float jest niepotrzebny?
Operand modulo (%) działa tylko z liczbami całkowitymi, dla zmiennych o typie float/double musisz użyć funkcji fmod. Co ma sens ze względu na zapis liczby. BTW, na AVR typ double jest równy typowi float. No i nie używaj typu float do liczenia czasu, w wielu przypadkach uzyskasz bezsensowne wyniki, co jest związane ze skończoną reprezentacją zapisu liczby.
Treść jest beznadziejna zadania wiem o tym ale taką otrzymałem od profesora:D Czyli mam stworzyć jeden pojemnik Vector typu int,long,float,double?? "Zadeklarowanie funkcji operujących"czyli o co chodzi?? To głupie pytanie ale w ogóle nie miałem tego na zajęciach.
Zapewne nie zlinkowałeś programu z właściwą wersją printf - standardowa nie obsługuje float/double. Oprócz dodania biblioteki libptrintf trzeba też zdefiniować symbol linkera vsprintf. A najlepiej to całe double wywalić w diabły i przejść na int. Symbol F_CPU masz zdefiniowany?
Witam, Tak na oko 0*45 jest 0. Jako unsigned też powinno być 0. Spróbuj zamiast "20" dać "20.". Dodano po 27 20.0f. Bez f będzie double.
Let me google it for you :) Wystarczy w google wpisać: "float to string C" aby otrzymać: double num = 123412341234.123456789; char output Arduino standardowo dołącza biblioteki wyswietlajace float, bo AVR Studio nie?
Witam ponownie. Uporałem się z podwójnym buforowaniem, przez co obracający się sześcian wygląda przyjemnie, dopisałem też kilka efektów: Oto cieniowanie Gourauda ze światłem świecącym z przodu. Świetna robota. Do obliczeń 3D używałeś zmiennego przecinka (float/double w C) czy arytmetyki fixed point?
Pierwsza uwaga - jak widzę prowadzisz obliczenia na liczbach podwójnej precyzji - AVR-libc nie wspiera takich obliczeń, dostępny jest jedynie typ float. double jest równy float i nie zwiększa precyzji obliczeń. Więc pierwszy błąd wynika z zaokrąglenia liczby do około 7-8 cyfr znaczących. A dalej to proponuję odpalić ten kod w symulatorze i porównać...
(at)grzegorzn - FPU w Cortex M jest 32bitowy, nie ma natywnych instrukcji na typie 64bitowym więc ich stosowanie na siłę uważam za nierozsądne. (at)_lazor_ nie wiem co to za pierdoły. Jaki "upscale" do 64bit? Przecież taka konwersja jest bez sensu, szczególnie, że domyślnie aktualnie do floating point używane są instrukcje SSE2 a nie x87. Niemniej jeśli...
Masz źle napisanego SQL. Insert into tabela.. Zauważ, że puszczasz zapytanie do bazy. Całe zapytanie jest stringiem, więc nie ma problemu żeby zainsertować do bazy coś, co było w we właściwości Text. Nie trzeba tego w żaden sposób konwertować. Co najwyżej musisz pamiętać o tym, że w liczbach zmiennoprzecinkowych w zapytaniu mają być kropki, a nie przecinki....
Inna możliwość, jeżeli potrzebujesz takiej precyzji to wszystkie zmienne zaangażowane w obliczenia muszą być tego typu, inaczej gdzieś może te znaczące cyfry zgubić. Też na to wpadłem :) I właśnie myślałem, że to przez to bo miałem liczoną potęgę typu float i później long double dzielone przez float ale też zrobiłem long double i niestety nic nie zmieniło....
to już moim zdaniem szczyt lenistwa :/ sec(x) = 1/cos(x) cosec(x)=1/sin(x) i nie ma czegoś takiego jak "ec" :) hehe i podpowiedzi: -cosinus liczy funkcja: double cos(double x); float cos(float x); //[C++ only] -sinus liczy: double sin(double x); float sin(float x); //[C++ only] -liczba do potęgi: (np: x kwadrat) double pow(double x, double y); float...
Z tego co doczytałem int ma dwa bajty, long int, float, double cztery i jest to najwięcej co oferuje kompilator dla AVR (long long tez tylko 4 bajty). Właściwie dzisaj skończyłem program, przynajmniej część podstawową, wszystko działa. Została kosmetyka, upiększanie, wyszukiwanie co da się uprościć albo 'ufunkcyjnić':) Zostało mi 50% pamięci do wykorzystania.
mnozysz to co tam liczysz przez 100 i juz masz 2 miejsca po przecinku. albo (w specyficznych zastosowaniach) masz dwie zmienne - jedna od czesci calkowitej, druga od czesci ulamkowej. podaj konkretny przyklad problemu, to wtedy mozna wymyslic konkretne rozwiazanie go, bo przeciez zaden termometr cyfrowy nie zwraca ci wartosci typu double. na przyklad...
Tak jak napisałem, teraz zrób konwersję tego str na float lub double (za pomocą atof lub strtod ).
zamiast float uzywaj double - podwojna precyzja A co do mozliwego zapisu liczb, to float/double umozliwia zapisanie wiekszej/mniejszej liczby niz int, tyle tylko, ze przy tak duzych liczbach zacznie wprowadzac drobne bledy w obliczenia. "i chciałem żeby powieściła jak największe wartości." A jak sie przez moment zastanowisz, to twoj sposob myslenia...
A te funkcje cos/sin to jakieś wlasne implementacje? Przyjmują one kąt w radianach w postaci fixed point? Bo normalne przyjmują wartość typu float/double, poza tym wymagają załączenia libm (chyba, że używasz gcc>4.7.0). No i stosowanie typu 64 bitowego dla reprezentacji punktu na wyświetlaczu o rozdzielczości 128 pikseli to prawdziwy hardcore :)
a) for 0 to tab.length-1 { wczytaj liczbe do tablicy intow } wypisz te komorki w ktorych jest liczba nieparzysta np. przy pomocy %2 b) stworz tablice float/double i wczytaj liczby jak wyzej, nastepnie wypisz liczby jako podniesione do kwadratu (do potegowania masz wbudowana funkcje)
Język C definiuje tylko minimalne wymagania dla zmiennych i ich minimalne długości. To, że na jednym CPU int będzie miał 16 bitów, nie znaczy, że na innym nie będzie miał 32 a nawet 64 bitów. Podobnie jest z float i double, one muszą być co najmniej 4 bajtowe (wykładnik + mantysa), ale to nie znaczy, że nie mogą być większe, co zwiększy precyzję. Także...
unsigned long r = sqrt(p); Objaśnij może jak ma działać ten Twój algorytm. Na pierwszy rzut oka -> sqrt() zwraca Ci wartość zmiennoprzecinkową (float/double), a Ty przypisujesz to do typu całkowitego (long), więc możesz mieć błąd, chyba że to zaokrąglenie algorytm zakłada?
Pytanie jakiej precyzji oczekujesz i czy jest sens korzystać z części ułamkowej skoro precyzja samego przetwornika i tak nie pozwala ufać tej części wyniku. Pozwala pozwala ufać i spokojnie można to wykorzystywać bez żadnych zmiennych typu float/double. Absolutnie bez takich zmiennych. Wszystko w oparciu o zmienne typu word/long itp .... a część ułamkową...
szybka transformana fouriera sygnału dżwiękowego w czasie rzeczywistym Nie rób fft przypadkiem na floatach a fixed point. pamiętaj że 990.0 to nie jest float tylko double, float to 990.0f Wirtualne metody to jedna z tych rzeczy w cpp, które powodują że kod jest wolniejszy niż ten napisany w C :P Jeśli ich naprawdę nie potrzebujesz to nie ma co ich...
Ok zgadzam się, ale jeśli zadeklaruje zmienne jako float albo double czyli zmiennoprzecinkowe wówczas na wyświetlaczu nic się nie pojawia...
To dlatego, że liczby reprezentowane są na skończonej liczbie bitów i w końcu "rozbijamy" się o te pojedyncze bity. Typ "float" to 32 bity zmiennoprzecinkowe, zmień na "double" a się poprawi. Radzę poszerzyć swoją wiedzę na temat typów zmiennoprzecinkowych a wszystko stanie się jasne.
O ile pamiętam, cin czyta do pierwszego znaku nadającego się do potraktowania jako część liczby całkowitej, gdy piszesz "int n << cin". Oznacza to, że po podaniu "1.5" cin zużyje "1", a ".5" pozostanie w buforze. Gdybyś próbował, bez wyczyszczenia bufora, odczytać kolejną liczbę całkowitą, otrzymałbyś zero, bo konwersja próbowałaby zacząć się...
Co do dziwnych wartości to one się pojawiają przy zmiennych typu float ale przy double jest już lepiej. Chyba funkcja FloatToStr może przyjąć jako parametr zmienne z grupy extended, gdzie float się nie zalicza tak samo jak double ;) A jeśli chodzi o format liczby to można zrobić wstępną filtracje podczas wprowadzania znaków, przejmująć np zdarzenie...
Twój kod działa poprawnie dla odpowiednio małych liczb. jak skompilujesz i uruchomisz: [syntax=cpp]#include <limits> #include <iostream> int main(){ int minimalnyInt = std::numeric_limits<int>::min(); int maksymalnyInt = std::numeric_limits<int>::max(); float minimalnyFloat = std::numeric_limits<float>::min(); float maksymalnyFloat...
1. zmienna typu float/double zajmuje w pamięci odpowiednio 2 i 4 bajty w pamięci. Twój tok rozumowania jest błędny już na etapie założeń... W avr-libc którego używasz nie ma w ogóle typu double, a zmienna float nigdy i nigdzie nie zajmuje 2 bajtów. Dalej idąc, wysyłając "po bajcie" trafisz na taki problem, że program który to będzie odbierał niekoniecznie...
Witam, Kolega tmf ma całkowitą racje, na AVR unikamy operacji float jak ognia. Nie dość że koszmarnie wolne to jeszcze zjadają sporo flash. Lepiej zrobić kilka operacji mnożenia i dzielenia niż jedną na typie float. Poza tym AVR GCC nie obsługuje liczb typu double, traktuje ją tak samo jak float (tyle samo bajtów w pamięci zajmuje double co float) mimo...
Mam pytanie jak ( czy w ogóle się da ) odczytać za pomocą jakiegoś makra, zmienną typu float ( double ). Rozumiem że można w pewien sposób zbudować swoją własną funkcję z makr "eeprom_read_word" . Ale jak by było jakieś makro do tego, to by było super. Dodam że udaje się wprost zadeklarować taką zmienną : double EEMEM przelicznik = 0.6435; Zmieniłem...
Nie bo chciałem zrezygnować z liczb zmiennoprzecinkowych bo sam7s nie mają jednostki fpu.Gdy bym miał pod ręką jakąś ATMege to z chęcią bym też zobaczył jak na niej te algorytmy się spisują;) Przesadzasz trochę. Liczby stałoprzecinkowe jeszcze bardziej pokazywałyby ten problem o którym piszesz. Stały przecinek ma stałe "ziarno" i tam gubiłbyś stałą...
pierwszy znak jaki dostajesz z UARTa to '$', poniewaz nie ma warunku na ten konkretny znak to wywoluje sie warunek default. poniewaz jest to pierwszy znak to wskaznik ma wartosc 0. zapisujesz ten znak pod adres zero. operacja ta konczy sie natychmiastowym krytycznym wyjatkiem jadra, poniewaz zapis flasha (adres 0) przez kod programu nie jest mozliwy....
Problem pochodzi od niemożliwości dokładnego zapisu ułamków nie będących potęgami liczby 2 (właściwie 1/2^x) np. dokładnie daje się zapisać liczbę 0.5; 0.25; 0.125 ... (oraz ich sumę). Problem może być rozwiązany przez dodanie pomocniczej (kosztem zwiększenia czasu wykonywania kodu) zmiennej o typie float lub double (lub const float/double), do której...
1. CVAVR nie posiada typu double, jedynie float 32 bit ;-). Zamiana z float na double nic nie daje. 2. Zmienne innych typów przechodzą przez va_arg bez problemu - jedynie z float są problemy. EDIT: Udało się dokonać konwersji przez unię: [syntax=c]typedef union { float fl; uint32_t u32; } test_t; test_t test; test.u32 = va_arg(args, uint32_t); ftoa(test.fl,...
tą metodę i tak mi zostało. float i double sprzyja rozrastaniu się bajtów w kodzie Nie pojmuję twojego rozumowania. Przecież float to tylko 4 bytes w SRAM , a uproszczony kod programu zaoszczędza o wiele więcej pamięci FLASH. Co do przydzielania wielkości tego bufora Bierzesz tyle ile potrzebujesz. Wartość określająca rozmiar tablicy array musi byc...
Na LCD możesz tak wyświetlić, nie musisz używać float/double tak samo do obliczeń, zamień na jedną liczbę całkowitą. Itoa w implementacji to lekkie funkcje, dalej tylko przesłać. [syntax=c] short pomiar = 0xFE6F; int temperature = (pomiar >> 4) * 10000; if ( pomiar & 0x08 ) temperature += 5000; if ( pomiar & 0x04 ) temperature += 2500; if ( pomiar &...
Przykład na dynamiczne utworzenie i korzystanie z 2D tablicy float: { double **array; const int xsize=4; const int ysize = 12; array= new double *[ysize]; int i,j; for (j=0;j<ysize;j++){ array[j]=new double [xsize]; for (i=0;i<xsize;i++) array[j][i] = 10*j+i; } for (j=0;j<ysize;j++) { // double *x = array[j]; for (i=0;i<xsize;i++) { printf("...
Takiego, w jakim została zadeklarowana. Np. float, int . Poszukaj fragmentu, gdzie jest jej deklaracja np: int a; float a; double a; (jest to liczba w notacji naukowej 2.9 * 10^5, czyli 290000)
No to w sumie temat jest prosty. Poprzednio zrozumiałem że tę funkcję chcesz ładować z zewnątrz w trakcie pracy procesora (np. z PC albo innego układu podłaczonego jakimś interfejsem komunikacyjnym) robisz sobie wskaznik na funkcję. Jak chcesz zmienic co jest wołane zmieniasz po prostu ten wskaźnik: [syntax=c]float Oblicz(float v1,float v2){ return...
http://www.fftw.org/ - na tej stronie znajdziesz bibliotekę dopasowującą się do procesora. Biblioteka ma zestaw funkcji (a raczej są to 3 osobne bibtioteki) dla danych typu float, double i long double. Mając procesor z zestawem instrukcji SSE1, wybierz zestaw float (libfftw3f-3.dll) - w sumie wersja float jest najszybsza, bo obliczenia wykonują się...
Jak to jest z FPU w mikrokontrolerach ESP8266? W ESP8266 nie ma FPU. Jest w ESP32 i dotyczy tylko operacji na typach float (a już nie double). Operacje z wykorzystaniem FPU wstrzymują niestety przerwania i nie należy używać zmiennych float w przerwaniach.
To, że makro (bo to nie jest funkcja), jako argument ma float nie ma znaczenia, przy podawaniu opóźnienia jako stałej. Nie rozumiem co masz tu na myśli. Tam nie ma żadnego float. Jest double. Mówię o funkcjach _delay_ms i _delay_us.
Witam serdecznie! Chciałbym się dowiedzieć czy istnieje jakaś możliwość odgórnego zdefiniowania zmiennej typu float/double w pamięci EEPROM przy jednoczesnym nadaniu jej wartości. Do tej pory robiłem to w ten sposób, ze tworzyłem zmienną w eepromie i za pomocą te funkcji: void eeprom_write_block(const void *src, void*dst, size_t n) zapisywałem...
wszystko super pieknie dziala :) dzieki no ale jest kolejny problem jak dodaje liczby np.: 2,4 + 2,8 to wypisuje mi wynik 5,19999980926514 jak to zrobic aby to zaokraglilo ?? zmienne przecinkowe mam jako float bo double i char mi nie przyjmuje ;/
Znalazłem opis algorytmu. Teraz dopiero zrozumiałem, że punkty stawiane są symetrycznie względem osi nachylonej pod kątem 45 stopni. Mogę więc stwierdzić, że to proste. Zmieniłem double na float bo nie wiem czy FPU w STM32F373 obsługuje double.
Jeśli Cię to satysfakcjonuje, to możesz użyć: #include <float.h> // double f(double x); lim_minus = f(x * (1.0 - DBL_EPSILON)); lim_plus = f(x * (1.0 + DBL_EPSILON)); DBL_EPSILON jest najmniejszą reprezentowalną liczbą typu double dla której zachodzi 1.0+DBL_EPSILON != 1.0 Dla innych typów jest to FLT_EPSILON...
zmieniłem wynik z milisekund na sekundy poprzez elapsedTIme = (millis() - startTime)/1000, jednakże "elapsedTime" nie wyświetla wyniku po przecinku a zaokrągla liczby. Jak sprawić by zmienna elapsedTIme wyświetlała liczby niecałkowite? Wstępna ocena dostępnych informacji Analiza podanych przez użytkownika danych: - Użytkownik zmienił wynik pomiaru...
Już wszystko wiem. Midlety w wersji CLDC 1.0 nie posiadaja wbudowanej klasy Float i Double i nie jest możliwe operowanie na tych zmiennych. Aby temu zaradzić trzeba użyć pakietu henson.midp.Float Klasa ta jest darmowa i można ją pobrać ze strony http://henson.newmail.ru/j2me/Float.htm Mam nadzieje, że w przyszłości komuś się to przyda, gdyż CLDC 1.0...
sqrt wymaga argumentu typu double float albo long double , kompilator nie wie do której z tych funkcji rzutować wejściowy int , więc pisze : 'sqrt' : ambiguous call to overloaded function gdyby była tylko jedna wersja funkcji sqrt, wywołanie [syntax=c] sqrt(2);[/syntax] było by poprawne, bo nie było by niejednoznaczności.
Jasne ! sqrtf już nie konwertuje na double. Ale jeszcze dopytam z ciekawości, skoro FPU ma wsparcie dla float to jak jest wykonywany sqrt dla double ?
Freddie prośba o wytlumaczenie. Mam szybki MCU. Starcza mi mocy więc wrzucam float, double i co tam jeszcze bez namysłu. Czy potrzebne, czy nie i wręcz przeszkadza. I to nazywasz duchem czasu. A zwykły delay nazywasz złym nawykiem. A przecież on jest często też najprostszym rozwiązaniem problemu. Jeśli więc starcza mi mocy ... Dlaczego stosujesz inną...
Rzeczywiście, problem dotyczy konsolidacji. Mimo tego nadal nie jestem w stanie stworzyć pliku wynikowego, który mógłbym wgrać do uC. Pytanie nadal aktualne: Dlaczego przekazując do funkcji zmienne float albo double nie jestem w stanie stworzyć programu wykonywalnego? EDITED: Spróbowałem linaro i na nim poszło bez problemu.
Trochę nie składnie to napisałem, ale przy pow() mam ten sam błąd. Jakby ktoś chciał to mała funkcja na pierwiastek: float moje_sqrt(float a) { double x=1; int i=20; while(i--) { x=(x+a/x)/2; } return (float)x; } Ale nie podoba mi się ten błąd :/
wynik chciałem mieć z dziesiątymi częściami ale gdy zadeklaruje zmienna pomiar jako float albo double to pożera mi zbyt dużo miejsca w kodzie może jest na to jakieś inne rozwiązanie? To trzymaj w int dziesiąte części stopni zamiast jednostkowych i konwertuj tylko przed wyświetleniem.
Witam Orientujecie się czy w Eclipse trzeba włączać działania na liczbach zmiennoprzecinkowych zadeklarowanych jako float lub double, jeśli tak to jak? Napisałem prostą funkcję #include <math.h> double wynik; wynik = 25/16; i niestety zwraca mi tylko wynik = 1 :( zamiast 1,5625 Pomóżcie
W CodeSourcery (a raczej w newlibie) nie ma dtostr() tak samo jak nie ma np. itoa(). Są inne funkcje konwertujące double/float to stringa, ale są równie rozbudowane jak sprintf() (syscalls). 4\/3!!
Brakuje tu "volatile". Zauważ proszę, że w tym przypadku właśnie rozmiar bajtowy jest istotny, aby mieć "zgodność" z bajtowym odczytem rejestru danych SPI. Jest to część zestawu funkcji, które napisałem dość dawno temu. Dzisiaj używam DMA + kolejki zadań dla interfejsów SPI, UART lub I2C, więc nie mam potrzeby stosowania ręcznej kontroli transferu....
(at)tobiasz54 Rozwiązanie jest do kitu, bo typy float i double nie są w stanie reprezentować wszystkich elementów zbioru liczb rzeczywistych. Efekt będzie taki, że po ostatniej linii (tam gdzie jest return) w wyniku dzielenia potencjalnie może powstać liczba, która nie ma bezpośrednio reprezentacji w typie i np. zamiast 10.000 będziesz miał 10.00000001,...
Zrobiło się 20 bo liczba 131232323.7 zapisana jest jako 1.3123232e+008 (= 131232320.0) Polecam podwójną dokładność - double. [syntax=cpp]double a = 131232325465465.755; if( a == double( (long long)a) ) //sprawdzamy czy całkowita printf("%.0f",a); else printf("%.1f",a); [/syntax]
tzn nie jest to równe 63 ale ok -63.563. i jak bardziej grzeje tym temp maleje i jest ujemna Dodano po 3 ok ..już wszystko jasne...niepotrzebna konwersja z float do double dla dodatnich liczb....
double a; sscanf("1234.56789123", "%lf", &a); 1. W avr-libc double=float wiec nie ma sensu stosowania typu double. 2. Spróbuj funkcji atof(). Ale wynik może być ten sam warto poszukać w dokumentacji biblioteki czy przypadkiem nie jest to ograniczone.
Raczej nic to nie zmieni. W funkcjach variadic float jest traktowany jak double (zajmuje 8 bajtów lub 2 rejestry), stąd problem. Kompilator dba o stos podczas pracy programu, ale to co dostaje na wejściu musi być wyrównane do 8-miu bajtów. Jeśli chcesz znaleźć źródło problemów, to olej na chwilę FreeRTOSa i po prostu w jakimś programiku zwykłym przetestuj...
* The values of the columns Size and Range depend on the system the program is compiled for. The values shown above are those found on most 32-bit systems. But for other systems, the general specification is that int has the natural size suggested by the system architecture (one "word") and the four integer types char, short, int and long must each...
Pierwsze, co można stwierdzić od razu: wielokąty o nieparzystej liczbie wierzchołków NIE MAJĄ środka symetrii. Nigdy. :-) Dodano po 6 A jak sprawdzić dla parzystej ilości? Hmm... Przyszło mi do głowy coś takiego (załóżmy że mamy wielobok o N wierzchołkach, N parzyste): - wybieramy dowolny wierzchołek i oznaczamy do jako pierwszy - ustawiamy wierzchołki...
Na problem z symulatorem bym nie liczył. Co do obliczeń, to można je jeszcze kilkakrotnie skrócić korzystając z typów stałopozycyjnych. BTW, implementacja gcc na AVR zakłada, że double=float.
float double stm32 float double pamięć double drive
drukarka canon pixma papier pułapka basowa tworzyć instalka
reklamacja wtryskiwacze stable diffusion
Rozmyty ekran LCD - problem z taśmą sygnałową Telewizor Philips OLED wyłącza się po logo - przyczyny i rozwiązania