Article View: pl.comp.lang.c
Article #310450Re: Zamiana real na int
From: Maciek Godek
Date: Wed, 01 Mar 2023 12:06
Date: Wed, 01 Mar 2023 12:06
57 lines
3374 bytes
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.
Technical Details
Message-ID:
<3c2ba06e-3672-4618-a5c6-b7700623a4b8n@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.samoylyk.net!usenet.blueworldhosting.com!feed1.usenet.blueworldhosting.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mailReferences:
<cdb9dcd7-cbe3-432d-b4af-5dca197d4eadn@googlegroups.com> <c6a3090b-7aaa-41d3-86cd-8fa52d729ce4n@googlegroups.com>Show Full Headers
Complete Article Headers
X-Received: by 2002:ac8:c8:0:b0:3bf:d025:1ac1 with SMTP id d8-20020ac800c8000000b003bfd0251ac1mr1492388qtg.11.1677672374191; Wed, 01 Mar 2023 04:06:14 -0800 (PST) X-Received: by 2002:a25:e812:0:b0:a5f:0:bf12 with SMTP id k18-20020a25e812000000b00a5f0000bf12mr893283ybd.13.1677672373632; Wed, 01 Mar 2023 04:06:13 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.samoylyk.net!usenet.blueworldhosting.com!feed1.usenet.blueworldhosting.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.c Date: Wed, 1 Mar 2023 04:06:13 -0800 (PST) In-Reply-To: <c6a3090b-7aaa-41d3-86cd-8fa52d729ce4n@googlegroups.com> Injection-Info: google-groups.googlegroups.com; posting-host=62.67.214.101; posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r NNTP-Posting-Host: 62.67.214.101 References: <cdb9dcd7-cbe3-432d-b4af-5dca197d4eadn@googlegroups.com> <c6a3090b-7aaa-41d3-86cd-8fa52d729ce4n@googlegroups.com> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <3c2ba06e-3672-4618-a5c6-b7700623a4b8n@googlegroups.com> Subject: Re: Zamiana real na int From: Maciek Godek <godek.maciek@gmail.com> Injection-Date: Wed, 01 Mar 2023 12:06:14 +0000 X-Received-Bytes: 3551 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit