🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #310450

Re: Zamiana real na int

#310450
From: 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.
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-mail
References: <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