Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 01. 10. 2011 11:43

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Zaokrouhlování

Zdravím,

nepamatuje si někdo, kde je (math.h?) a jak se jmenuje céčková (++ ani # nechci) knihovní funkce pro zaokrouhování na ne-celé číslo (tedy se stanovenou (volanou) přesností? Potřebuju zaokrouhlovat čísla, která mi vzniknou několika děleními na dvě nebo tři místa vždy směrem dolů (s tím nemám problém, to si udělám formou "napiš si sám", odečtením 0.005 nebo 0.0005 a takto upravenou hodnotu zaokrouhlím klasicky, samozřejmě pokud i na to je knihovní funkce (o které jsem ale nikdy neslyšel), tak rád použiju tu.

Pamatuje si to někdo? Hledal jsem v MSDN, ale všechno co na mně vypadlo bylo .NET, C# nebo C++, což nepotřebuju, potřebuju to použít v knihovně, ve které nechci tahat "zbytečnosti".

Díky


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#2 01. 10. 2011 22:29

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Zaokrouhlování

Zdravím,
nevím přesně, co myslíš.
V holém C a knihovně math.h najdeš tyto funkcičky:

double aceil(double x);
- Zaokrouhlí argument na nejmenší vyšší celé číslo.

double floor (double x);
- Zaokrouhlí argument na nejbližší nižší celé číslo.

double round(double x);
- Zaokrouhlí číslo na nejbližší celé číslo.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#3 02. 10. 2011 11:13

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Zaokrouhlování

↑ RePRO:

jj, díky, o tom vím. Jinak funkci round() v math.h  ani nemám, což nevadí, s funkcemi ceil() a floor() si v tomto případě postačím (a round() si snadno nasimuluju příslušným testem nebo úpravou argumentů)

Ale potřeboval jsem (už jsem si teda poradil metodou "do it yourself") zaokrouhlit double na double se stanovenou přesností - tedy prototyp by měl vypadat jako double dround(double value, int precision), a když si jí zavolám s parametry (1.6587452, 3), aby vrátil 1.659.

Ovšem, po marném hledání (přesto mám takový pocit, že jsem tuhle funkci používal, ovšem to už je nějaký pátek), co bych si měl includnout a jak si to zavolat jsem to vyřešil přes celá čísla (double vynásobím přesností) , funkcí floor(), která "zahodí" zbytek co je za tečkou, a opětovným vydělením přesností - a to vrátím.

Přijde mi jen, že těch operací a meziproměnných je zbytečně mnoho, už tak udržuju spoustu režijního kódu, tak kdyby se našla knihovní funkce umící výše uvedené, tak samožrejmě bych radši použil tu (navíc knihovní funkce bývají o výraznou porci času rychlejší).


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#4 02. 10. 2011 11:44

LukasM
Příspěvky: 3274
Reputace:   193 
 

Re: Zaokrouhlování

↑ frank_horrigan:
Nikdy jsem o podobné funkci neslyšel, pochybuji že je někde ve standardních knihovnách C. Mimochodem, ve tvém příkladě by ta funkce asi měla vrátit spíš 1.658, aby to dělalo co jsi říkal.

I tak pochybuji, že by úspora času byla nějak významná, kdybys ji někde našel. A pokud jde o počet "meziproměnných", můžeš funkci napsat jako makro a nevytvořit žádnou navíc, ne? Při volání knihovní funkce by se proměnné tvořily, a navíc i ta knihovní funkce to musí nějak udělat (možná stejně jako ty). Co řešíš že ti tak leží na srdci rychlost? A seš si jistý, že zbytek tvého kódu je tak efektivní, aby mělo smysl tohle řešit?

Neplánuju pevně stát za tím co píšu, pokud jde o C, už jsem dost vyšel ze cviku, spíš se ptám.

Offline

 

#5 02. 10. 2011 13:05

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Zaokrouhlování

↑ LukasM:

ano, s 1.658 máš pravdu, ovšem to bych od knihovní funkce neočekával, předpokládal jsem že existuje funkce pro "klasické" zaokrouhlování (a vždy směrem dolů už bych si udělal explicitně odečtením pětky z dalšího řádu (pracuji s kladnými čísly, záporné neřeším)

Jinak, funkci jako makro napsat samozřejmě můžu, to mně nenapadlo (a ani jsem to snad nikdy nedělal, takže nemám zkušenosti s tím jak se to chová, makra jen používám)

No, samozřejmě, že i tvůrce (předpokládejme) to musel nějak řešit, ovšem víme, že knihovní funkce jsou mnohem efektivní, většina jich je dělaná v nějaké formě assembleru (ač to také není přesné vyjádření, a lze napadnout, jen chci ilustrovat rozdíly, na rozdíl od složitých překladů a pozdějšího výkonu funkce napsané "udělej si sám" (v assembleru, nebo v nečem podobném to fakt psát nechci, od školy jsem to neviděl, a nepamatuju si nic)

Jinak tvořím burzovní algoritmus, který má za úkol přečíst data, identifikovat signály a tyto rozeslat na servery brokerům (nevím, jestli víš co je to prostorová arbitráž, což ovšem není tématem tohoto vlákna, pokud máš chuť diskutovat na toto téma, založíme si nové v příslušné sekci). Tyto arbitráže mají tu vlastnost (stejně tak negativní bid-ask spready, které také by měly aplikace které tvořím umět číst), že jsou velmi nestabilní a velmi rychle zmizí (pojem velmi rychle bych v tomto případě definoval jako řádově první milisekundy, když už to trvá dlouho, tak 100 miliseknud, ale to je orpavdu obří číslo) - proto mi záleží na každé operaci, každé proměnné kterou musím deklarovat a dále s ní pracovat, na každém řádku.
Jistý efektivitou ostatního kódu si jistý samozřejmě na 100% být nemohu, ale mohu s klidným svědomím říct, že dělám co umím a hlídám si, abych nepsal zbytečnosti :)

Jinak, díky, ten tip na makro mně nenapadl, ale i tak si nedovedu moc představit, jak takovýto kód provlést jako makro (ale to už je moje neznalost, to už snad dohledám, jak by to šlo :) )


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#6 02. 10. 2011 13:16 — Editoval RePRO (02. 10. 2011 13:20)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Zaokrouhlování

Hele,
ale věř mi, že jsem tu funkci taky hledal, která má jako druhý parametr přesnost (taky si pořád myslím, že jsem jí v minulosti používal).
Ale víš, čím to u mě bude?
Já si to totiž pletu s PHP. V PHP máš funkci, kde druhý parametr udává přesnost. Takže přesnost si musíš v C doprogramovat. V C++ se to dá řešit zase elegantně pomocí std::setprecision(přesnost). PHP: round(hodnota, přesnost).


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#7 05. 10. 2011 18:25

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: Zaokrouhlování

Nevim, jestli by to stacilo k tvym ucelum, dalo by se to napsat zjednodusene, treba tak:

#define floor1(x) floor(x * 10) / 10
#define floor2(x) floor(x * 100) / 100
#define floor3(x) floor(x * 1000) / 1000
atd...

A pak napsat pro predchozi pripad floor3 (1.6587452)

Zaokrouhlovat se da i pomoci prevadeni na cela cisla, co by melo byt i o neco rychlejsi, nejsem si jisty, jaka jsou pravidla pro to prevadeni, myslim, ze se to za desetinnou carkou odrizne. Napriklad:

#define int1(x) (double)(int)(x * 10) / 10
#define int2(x) (double)(int)(x * 100) / 100
#define int3(x) (double)(int)(x * 1000) / 1000

nebo

#define int3(x) (double)(int)(x * 1000 + 0.5) / 1000
atd...

Kdyztak dej vedet, jestli na tom jeste pracujes :-)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson