🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

7 total messages Started by Stachu Chebel Fri, 10 Feb 2023 05:48
Zamiana real na int
#310444
Author: Stachu Chebel
Date: Fri, 10 Feb 2023 05:48
13 lines
1587 bytes
Jak już kiedyś wspominałem, nie jestem ekspertem w C, stąd moje pytanie może wyglądać naiwnie. 
double a;
uint16_t k;
a=1.7;
k=(uint16_t)(a);

Ile będzie wynosić k? 1 czy 2? Można odpowiedzieć weź se skompiluj, 
uruchom, to zobaczysz. Tak, ale sprawa dotyczy programowania MCU
i akurat z pewnych względów debuggowanie jest dosyć upierdliwe.

Kolejne pytania do Kolegów znających Pascal'a. 
1) Jakie są odpowidniki w C, Pascal'owych funkcji Round i Floor?
2) Jak efektywne są ich kody maszynowe? Chodzi o czas.
Re: Zamiana real na int
#310445
Author: Stachu Chebel
Date: Fri, 10 Feb 2023 06:06
15 lines
1980 bytes
piątek, 10 lutego 2023 o 06:48:17 UTC+1 Stachu Chebel napisał(a):
> Jak już kiedyś wspominałem, nie jestem ekspertem w C, stąd moje pytanie może wyglądać naiwnie. 
> double a; 
> uint16_t k; 
> a=1.7; 
> k=(uint16_t)(a); 
> 
> Ile będzie wynosić k? 1 czy 2? Można odpowiedzieć weź se skompiluj, 
> uruchom, to zobaczysz. Tak, ale sprawa dotyczy programowania MCU 
> i akurat z pewnych względów debuggowanie jest dosyć upierdliwe. 
> 
> Kolejne pytania do Kolegów znających Pascal'a. 
> 1) Jakie są odpowidniki w C, Pascal'owych funkcji Round i Floor? 
> 2) Jak efektywne są ich kody maszynowe? Chodzi o czas.
Aha, GNU Arm CORTEX M4
Re: Zamiana real na int
#310446
Author: Arnold Ziffel
Date: Fri, 10 Feb 2023 12:40
37 lines
2044 bytes
Stachu Chebel <stchebel@gmail.com> wrote:

> Jak już kiedyś wspominałem, nie jestem ekspertem w C, stąd moje pytanie może wyglądać naiwnie. 
> double a;
> uint16_t k;
> a=1.7;
> k=(uint16_t)(a);
> 
> Ile będzie wynosić k? 1 czy 2?

Będzie 1. Rzutowanie po prostu pozbywa się części po przecinku, nie robi 
zaokrąglania.

> Można odpowiedzieć weź se skompiluj, uruchom, to zobaczysz. Tak, ale 
> sprawa dotyczy programowania MCU i akurat z pewnych względów 
> debuggowanie jest dosyć upierdliwe.

A masz tam LEDa albo dowolną linię GPIO?

if(k == 1) led_on();

Taki LED debugging.

> 1) Jakie są odpowidniki w C, Pascal'owych funkcji Round i Floor?

W C nie ma, ale jest w bibliotece standardowej (math), nazywają się, 
niespodzianka, round() i floor().

> 2) Jak efektywne są ich kody maszynowe? Chodzi o czas.

Skompiluj, zobacz co wygeneruje kompilator. To zależy od platformy.

-- 
Przychodzi baba do lekarza:
- Panie doktorze, dziękuję za wspaniałe leczenie.
- Ależ ja leczyłem pani męża, nie panią!
- Tak, tak, ale ja po nim wszystko dziedziczę...
Re: Zamiana real na int
#310447
Author: Stachu Chebel
Date: Fri, 10 Feb 2023 14:03
34 lines
2682 bytes
piątek, 10 lutego 2023 o 13:40:10 UTC+1 Arnold Ziffel napisał(a):
> Stachu Chebel <stch...@gmail.com> wrote: 
> 
> > Jak już kiedyś wspominałem, nie jestem ekspertem w C, stąd moje pytanie może wyglądać naiwnie. 
> > double a; 
> > uint16_t k; 
> > a=1.7; 
> > k=(uint16_t)(a); 
> > 
> > Ile będzie wynosić k? 1 czy 2?
> Będzie 1. Rzutowanie po prostu pozbywa się części po przecinku, nie robi 
> zaokrąglania.
> > Można odpowiedzieć weź se skompiluj, uruchom, to zobaczysz. Tak, ale 
> > sprawa dotyczy programowania MCU i akurat z pewnych względów 
> > debuggowanie jest dosyć upierdliwe.
> A masz tam LEDa albo dowolną linię GPIO? 
> 
> if(k == 1) led_on(); 
> 
> Taki LED debugging.
> > 1) Jakie są odpowidniki w C, Pascal'owych funkcji Round i Floor?
> W C nie ma, ale jest w bibliotece standardowej (math), nazywają się, 
> niespodzianka, round() i floor().
> > 2) Jak efektywne są ich kody maszynowe? Chodzi o czas.
> Skompiluj, zobacz co wygeneruje kompilator. To zależy od platformy. 
> 
> -- 
> Przychodzi baba do lekarza: 
> - Panie doktorze, dziękuję za wspaniałe leczenie. 
> - Ależ ja leczyłem pani męża, nie panią! 
> - Tak, tak, ale ja po nim wszystko dziedziczę...

==============
Dzięki, wszystko jasne
Re: Zamiana real na int
#310448
Author: JDX
Date: Mon, 20 Feb 2023 06:28
8 lines
1627 bytes
On 10.02.2023 06:48, Stachu Chebel wrote:
[...]
> Ile będzie wynosić k? 1 czy 2? Można odpowiedzieć weź se skompiluj,
> uruchom, to zobaczysz. Tak, ale sprawa dotyczy programowania MCU
> i akurat z pewnych względów debuggowanie jest dosyć upierdliwe.
Jakiś mały kawałek kodu to można sobie do assemblera skompilować i 
przeanalizować. Można też skorzystać z godbolta-a: 
https://godbolt.org/z/o7zrWT44x. w ramach testu zmień sobie też -O3 na -O0.
Re: Zamiana real na int
#310449
Author: Przemek Biernat
Date: Wed, 22 Feb 2023 19:10
30 lines
2411 bytes
On Friday, February 10, 2023 at 6:48:17 AM UTC+1, Stachu Chebel wrote:
> Jak już kiedyś wspominałem, nie jestem ekspertem w C, stąd moje pytanie może wyglądać naiwnie. 
> double a; 
> uint16_t k; 
> a=1.7; 
> k=(uint16_t)(a); 
> 
> Ile będzie wynosić k? 1 czy 2? Można odpowiedzieć weź se skompiluj, 
> uruchom, to zobaczysz. Tak, ale sprawa dotyczy programowania MCU 
> i akurat z pewnych względów debuggowanie jest dosyć upierdliwe. 
> 
> Kolejne pytania do Kolegów znających Pascal'a. 
> 1) Jakie są odpowidniki w C, Pascal'owych funkcji Round i Floor? 
> 2) Jak efektywne są ich kody maszynowe? Chodzi o czas.

Nie używaj double'a tylko sobie zaimplementuj klasę decimal na dwóch unsinged int plus jedną zmienną jako flagę dla znaku. 

Np:

class decimal
{

private:

     unsigned int   calkowite;
     unsigned int   ulamki;

};

Do tego dorób property w public i wszystkie operatory oraz metody które będziesz potrzebował.
Re: Zamiana real na int
#310450
Author: Maciek Godek
Date: Wed, 01 Mar 2023 12:06
57 lines
3374 bytes
środa, 22 lutego 2023 o 20:10:27 UTC+1 Przemek Biernat napisał(a):
> On Friday, February 10, 2023 at 6:48:17 AM UTC+1, Stachu Chebel wrote: 
> > Jak już kiedyś wspominałem, nie jestem ekspertem w C, stąd moje pytanie może wyglądać naiwnie. 
> > double a; 
> > uint16_t k; 
> > a=1.7; 
> > k=(uint16_t)(a); 
> > 
> > Ile będzie wynosić k? 1 czy 2? Można odpowiedzieć weź se skompiluj, 
> > uruchom, to zobaczysz. Tak, ale sprawa dotyczy programowania MCU 
> > i akurat z pewnych względów debuggowanie jest dosyć upierdliwe. 
> > 
> > Kolejne pytania do Kolegów znających Pascal'a. 
> > 1) Jakie są odpowidniki w C, Pascal'owych funkcji Round i Floor? 
> > 2) Jak efektywne są ich kody maszynowe? Chodzi o czas.
> Nie używaj double'a tylko sobie zaimplementuj klasę decimal na dwóch unsinged int plus jedną zmienną jako flagę dla znaku. 
> 
> Np: 
> 
> class decimal 
> { 
> 
> private: 
> 
> unsigned int calkowite; 
> unsigned int ulamki; 
> 
> }; 
> 
> Do tego dorób property w public i wszystkie operatory oraz metody które będziesz potrzebował.

Szczerze - to zależy.
Jeżeli mikrokontroler jest dość duży, a szczególnie jeśli ma koprocesor, to używanie double nie musi być złym pomysłem.

Natomiast na mniejszych urządzeniach w pierwszej kolejności bym próbował raczej pracować na liczbach ułamkowych o stałej precyzji, realizowanych przez zwyczajne inty (albo ich odmiany).

Jeżeli miałbym implementować swoje ułamki, to raczej bym zajrzał do gotowej biblioteki - np. do GMP,
acz w większości zastosowań ułamki raczej nie będą potrzebne.

Z kolei na czymś w rodzaju:

double a;
uint16_t k;
a=1.7;
k=(uint16_t)(a); 

nigdy bym nie polegał.

Jeżeli już, pisałbym
k = (uint16_t) floor(a);
albo
k = (uint16_t) ceil(a);
albo
k = (uint16_t) round(a);
po zainkludowaniu
<math.h>
w zależności od tego, jakiego bym oczekiwał zachowania.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads