Zdravim pani.
Pracujem na jednom PID regulatore a narazil som na jednu nezrovnalost.
Definicia typu float obsahuje tuto veticku:
Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38.
Mne vsak nerobi problem pocitat s cislom 1000,00.
Ako to teda u tohto typu funguje? Nikde som sa to totiz nedocital.
Je tam nejaka automaticka matematika,ktora pri vyssom celom cisle degraduje presnost za desatinnou bodkou?
Potrebujem presnost na 4 desatinne miesta,ake vysoke cislo to pri tejto presnosti zvladne?
Alebo je cela moja teoria uplne nespravna a funguje mi to nejakym zazrakom?
Dakujem za vysvetlenie.
Arduino a float
Moderátor: Moderátori
- lucky62
- Zaslúžilý člen
- Príspevky: 1151
- Dátum registrácie: 14 Feb 2012, 20:16
- Bydlisko: Liptovský Mikuláš, SK
Re: Arduino a float
Nerozumiem tejto vete:
najmenšie číslo je: -3.4028235 * 10^38 (je to záporné číslo)
najväčšie číslo je: +3.4028235 * 10^38 (kladné číslo)
Presnosť je pravdepodobne tých 7 desatinných miest, s ktorými sú tie čísla zobrazené. (to som si nie celkom istý, lebo vnútorne to môže počítať s väčšou presnosťou - niekde by to malo byť zdokumentované)
Neviem, ako chápeš túto definíciu:TomasNM napísal: Mne vsak nerobi problem pocitat s cislom 1000,00.
TomasNM napísal: Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38.
najmenšie číslo je: -3.4028235 * 10^38 (je to záporné číslo)
najväčšie číslo je: +3.4028235 * 10^38 (kladné číslo)
Presnosť je pravdepodobne tých 7 desatinných miest, s ktorými sú tie čísla zobrazené. (to som si nie celkom istý, lebo vnútorne to môže počítať s väčšou presnosťou - niekde by to malo byť zdokumentované)
0
-
- Zaslúžilý člen
- Príspevky: 1371
- Dátum registrácie: 22 Jan 2012, 19:24
- Bydlisko: Nové Mesto nad Váhom
- Vek: 43
Re: Arduino a float
Tych +/- 3.4cca je udavane v referenciach: https://www.arduino.cc/en/reference/float
Rozumiem tomu tak,ze:
A) cisla nad tento rozsah(pretecenie) su jednoducho ignorovane a pri prekroceni 3.4 sa zacina zasa od -3.4 atd.(podobne ako u integer).
B) ak je pouzite cislo nad tento rozsah,znizi sa presnost za desatinnou ciarkou.
Ja vsak pouzivam aj daleko vyssie hodnoty,ako 3.4(tych 1000.00),tak mi to A nedava zmysel.
Teraz som si vsimol ten doplnok * 10^38.
Tak to som uz uplne blby z toho,pretoze tak by sa 3.4 vynasobilo o 38 nul????
Rozumiem tomu tak,ze:
A) cisla nad tento rozsah(pretecenie) su jednoducho ignorovane a pri prekroceni 3.4 sa zacina zasa od -3.4 atd.(podobne ako u integer).
B) ak je pouzite cislo nad tento rozsah,znizi sa presnost za desatinnou ciarkou.
Ja vsak pouzivam aj daleko vyssie hodnoty,ako 3.4(tych 1000.00),tak mi to A nedava zmysel.
Teraz som si vsimol ten doplnok * 10^38.
Tak to som uz uplne blby z toho,pretoze tak by sa 3.4 vynasobilo o 38 nul????
0
- lucky62
- Zaslúžilý člen
- Príspevky: 1151
- Dátum registrácie: 14 Feb 2012, 20:16
- Bydlisko: Liptovský Mikuláš, SK
Re: Arduino a float
Presne tak, float čísla sa v pamäti držia vo formáte mantisa + exponent. Exponent je vždy celé číslo. Mantisa je desatinné číslo s danou presnosťou.TomasNM napísal:Tak to som uz uplne blby z toho,pretoze tak by sa 3.4 vynasobilo o 38 nul????
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Arduino a float
predpoklad A aj B je nesprávny. Každé float číslo sa interne normalizuje na x.xxxxxx * 10^ee
tvojich 1000.00 je 1.00000xx *10^3 alebo aj 0.999999xx*10^4
Float čísla sa totiž málo kedy trafia presne na int. vždy tam niečo prevyšuje alebo chýba.
Ja len potvrdím že číslo v danom rozsahu má 6 až 7 platných cifier. A pozor na AVR si nepomôžeš ani pomocou double. Teda vo avr-gcc
https://gcc.gnu.org/wiki/avr-gcc
Ale pre teba je tých 6 cifier asi dostatočných.
Najjednoduchšie je to neriešiť. Áno funguje to nejakým zázrakom. jeden float zaberá 32 bitov.
https://en.wikipedia.org/wiki/Single-pr ... int_format
tvojich 1000.00 je 1.00000xx *10^3 alebo aj 0.999999xx*10^4
Float čísla sa totiž málo kedy trafia presne na int. vždy tam niečo prevyšuje alebo chýba.
Ja len potvrdím že číslo v danom rozsahu má 6 až 7 platných cifier. A pozor na AVR si nepomôžeš ani pomocou double. Teda vo avr-gcc
https://gcc.gnu.org/wiki/avr-gcc
Ale pre teba je tých 6 cifier asi dostatočných.
Najjednoduchšie je to neriešiť. Áno funguje to nejakým zázrakom. jeden float zaberá 32 bitov.
https://en.wikipedia.org/wiki/Single-pr ... int_format
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Zaslúžilý člen
- Príspevky: 1371
- Dátum registrácie: 22 Jan 2012, 19:24
- Bydlisko: Nové Mesto nad Váhom
- Vek: 43
Re: Arduino a float
Pani,
dakujem za vysvetlenie.
Trochu som to pochopil,akurat som nesiel do detailov.
Takze som z toho pochopil,ze to bude fungovat OK a moje predpoklady boli nespravne.
dakujem za vysvetlenie.
Trochu som to pochopil,akurat som nesiel do detailov.
Takze som z toho pochopil,ze to bude fungovat OK a moje predpoklady boli nespravne.
0
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 4 Odpovedí
- 1054 Zobrazení
-
Posledný príspevok od používateľa lucky62
-
- 20 Odpovedí
- 1104 Zobrazení
-
Posledný príspevok od používateľa jankrizan
-
- 11 Odpovedí
- 1770 Zobrazení
-
Posledný príspevok od používateľa mirosne
-
- 10 Odpovedí
- 680 Zobrazení
-
Posledný príspevok od používateľa budvar10
-
- 3 Odpovedí
- 4167 Zobrazení
-
Posledný príspevok od používateľa jankrizan