Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zamiana real na int

21 views
Skip to first unread message

Stachu Chebel

unread,
Feb 10, 2023, 12:48:17 AM2/10/23
to
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.

Stachu Chebel

unread,
Feb 10, 2023, 1:06:29 AM2/10/23
to
Aha, GNU Arm CORTEX M4

Arnold Ziffel

unread,
Feb 10, 2023, 7:40:10 AM2/10/23
to
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ę...

Stachu Chebel

unread,
Feb 10, 2023, 9:03:54 AM2/10/23
to
==============
Dzięki, wszystko jasne

JDX

unread,
Feb 20, 2023, 1:28:27 AM2/20/23
to
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.

Przemek Biernat

unread,
Feb 22, 2023, 2:10:27 PM2/22/23
to
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ł.

Maciek Godek

unread,
Mar 1, 2023, 7:06:15 AM3/1/23
to
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.
0 new messages