logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Konwersja string na liczbę 8-cyfrową w Arduino

m72 01 Mar 2020 16:09 966 15
  • #1 18503507
    m72
    Poziom 12  
    Posty: 399
    Ocena: 28
    Jak w temacie, jak zamienić stringa na liczę. Mowa tu o liczbach 8-cyfrowych.
    Platforma Arduino - nie inna.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Powyższy kod daje w wyniku Daje w wyniku 40000000.00

    Na mniejszych liczbach niż 8-cyfrowe wszystko działa, używając np funkcji toInt(), toDouble, toFloat(). Powyżej 7-cyfr nie.
    Jaki jest na to sposób ?
    Może sscanf itp ale nie kumam jak ta funkcja działa.
    Może ktoś przerabiał temat to niech podpowie.
    Tylko błagam, po męsku, konkretnie a nie po "elektrodowemu".
  • #2 18503620
    Konto nie istnieje
    Poziom 1  
  • #3 18503632
    Janusz_kk
    Poziom 39  
    Posty: 5881
    Pomógł: 228
    Ocena: 1481
    Ale używasz float, po co jak jest long? a nawet long long który daje 64 bity?
  • #4 18503648
    m72
    Poziom 12  
    Posty: 399
    Ocena: 28
    Janusz_kk napisał:
    Ale używasz float, po co jak jest long? a nawet long long który daje 64 bity?


    No to zapodaj przykład jak zamienić w Arduino stringa 8-znakowego w longa 8-cyfrowego. Np 40000001.
  • Pomocny post
    #7 18503762
    Konto nie istnieje
    Poziom 1  
  • #8 18503876
    m72
    Poziom 12  
    Posty: 399
    Ocena: 28
    khoam napisał:
    m72 napisał:
    To spróbuj, a później pisz.

    Proszę bardzo:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No dobra, wybrnąłeś ;)
    Klikam pomógł.
    No to może wiesz jak to samo zrobić dla zmiennych typu float bo zmiana na "atof" coś mi nie działa.
  • #10 18503964
    m72
    Poziom 12  
    Posty: 399
    Ocena: 28
    _jta_ napisał:
    m72 napisał:
    Serial.println(test.toFloat());

    A jak jest reprezentowany typ Float? Zobacz w Wikipedii: Liczba zmiennoprzecinkowa#Implementacje sprzętowe. 40000001 używa 26 bitów.


    NIE pomógł.
    Jak pomagać to konkretnie jak kolega wyżej, albo w ogóle.

    Moderowany przez Marek_Skalski:

    Chciałbym tylko przypomnieć, że forum jest platformą do dyskusji i pomocy w ramach dobrej woli. Jeżeli Kolega ma problem z akceptacją tego, to może trzeba poszukać pomocy w innym miejscu.
    Proszę o zachowanie kultury i szacunku dla rozmówców. Nie będziemy tolerować takiego zachowania jeżeli się powtórzy.

    W razie wątpliwości polecam lekturę regulaminu, który Kolega zaakceptował rejestrując się na Forum.
    3.1.9. Nie ironizuj i nie bądź złośliwy w stosunku do drugiej strony dyskusji. Uszanuj odmienne zdanie oraz inne opinie na forum.
    3.1.17. Nie wysyłaj pytań bardzo podstawowych, na które odpowiedzi można znaleźć w instrukcji obsługi lub ogólnie dostępnych źródłach. Nie prezentuj postawy, że mi się należy. Dbaj o poziom pytań i dyskusji. Dziękujemy.

  • #11 18503996
    Janusz_kk
    Poziom 39  
    Posty: 5881
    Pomógł: 228
    Ocena: 1481
    _jta_ napisał:
    40000001 używa 26 bitów.

    Jesteś pewien? bo wg mnie 32 bity.

    To działa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #12 18504334
    Konto nie istnieje
    Poziom 1  
  • #13 18504414
    _jta_
    Specjalista elektronik
    Posty: 49153
    Pomógł: 3212
    Ocena: 4261
    Typ Float ma 23-bitową mantysę - w sensie: 23 bity są przeznaczone na mantysę - być może do tego jest 1 bit, który zawsze jest '1' (liczby, oprócz 0, są normalizowane tak, by najstarszy bit mantysy był '1'); liczba 40000001 potrzebuje 26 bitów, żeby zmieścić i najstarszy, i najmłodszy bit, więc przy konwersji na Float najmłodszy bit jest obcinany (a dokładniej, 2 najmłodsze się nie mieszczą - ponieważ są 01, więc nawet zaokrąglanie nie ma szans nie zgubić tej '1' - być może 40000002 zostałoby zaokrąglone do 40000004).
  • #14 18506552
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    khoam napisał:
    @m72 "Zakłócenia" są wprowadzane przez Serial.print(), a nie sposób konwersji. Jeżeli Serial.print() dostanie, jako argument wartość typu float, to nie jest w stanie wyświetlić poprawnie więcej niż 7 cyfr przed przecinkiem.

    Tak jak pisał kol. @_jta_ - zapis liczby float wprowadza ograniczenia ze względu na wielkość reprezentacji mantysy. print tego nie przekonwertuje lepiej, bo nie ma we float większej liczby danych potrzebnej do takiej konwersji. Jeśli komuś zależy na dokładności reprezentacji to używa typów stałopozycyjnych, które de facto są tylko reinterpretowanym typem całkowitym.
    Można się bawić w double, tylko tu osoby pracujące na AVR muszą uważać, bo zazwyczaj na tej platformie double = float.
  • #15 18506631
    Konto nie istnieje
    Poziom 1  
  • #16 18506677
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    khoam napisał:
    erial.print() konwertuje float do string bez wykorzystania funkcji bibliotecznych typu sprintf() czy dtostrf(). Robi to "na piechotę" przez iteracyjne dzielenie przez 10 i konwersję poszczególnych cyfr do znaków. Błędy, jakie mogą się pojawić przy tego rodzaju konwersji mogą być większe niż te, które wynikają z wielkości reprezentacji mantysy dla typu float.

    To a propos innej dyskusji pokazuje tylko jak nieoptymalnie są napisane niektóre funkcje w tym frameworku, co podkreśla "duże" kompetencje ich autorów.
    Niemniej, nawet, jeśli wykorzystywane byłyby funkcje konwersji zaimplementowane w bibliotece standardowej to float i tak daje średnio ok. 7 cyfr znaczących. Więcej z tego typu nie wyciśniesz, ze względu na wielkość mantysy.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem konwersji 8-cyfrowego stringa na liczbę całkowitą w platformie Arduino. Użytkownik zauważył, że użycie funkcji toFloat() skutkuje utratą precyzji dla liczb powyżej 7 cyfr. Uczestnicy sugerowali użycie funkcji atol() do konwersji stringa na typ long oraz atof() dla zmiennych typu float. Wskazano również na ograniczenia reprezentacji float, które mogą prowadzić do błędów w wyświetlaniu wartości. Zwrócono uwagę, że Serial.print() ma swoje ograniczenia w konwersji float, co może wpływać na dokładność wyświetlanych danych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA