Toon posts:

[C++] functie om af te ronden.

Pagina: 1
Acties:

Verwijderd

Topicstarter
hier is een functie om af te ronden door het af-te-ronden-getal en op welke decimaal(of tiental enz.) in te voeren:

voor m'n test programma(met input/output) hiervoor heb ik alleen stdio.h en iostream.h hoeven in te voegen, maar dat is geloof ik alleen voor de input/output en niet voor deze code.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
double AFRONDEN(double dVarfunction1,double dDecimalen)
{

// let op: dDecimalen moet 1 één en de rest nullen zijn.
// bv. 0.1, 0.0001, 10 of 10000 enz.  
    
         double dFunction1;
         double dFunction2;
         double dFunction3;
         double dReturnable;

    dFunction1 =  dVarfunction1 / dDecimalen;
    dFunction2 = dFunction1 - int(dFunction1);
    dFunction3 = dFunction2 - 0.5;
    if (dFunction3 >= 0)
    {
        dFunction3 = int(dFunction1) + 1;
        dReturnable = dFunction3 * dDecimalen;
    }
    if (dFunction3 < 0)
    {
        dReturnable = int(dFunction1) * dDecimalen;
    }
    return dReturnable;
}


voorbeeld:
dVar1 = 5.662;
dDecimaal = 0.1;
dSolution = AFRONDEN(dVar1,dDecimaal);
uitkomst is 5.7

dit stukje code werkt goed, maar toch zou ik willen weten of er iets is dat sneller of makkelijker in te voegen in een programma is dat hetzelfde doet.

en anders graag kritiek over fouten die ik over het hoofd heb gezien.

Verwijderd

Dit zou de code moeten zijn om een getal af te ronden, in ieder geval iets in deze geest.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<stdio.h>

double round(double n, double precision)
{
    double d;
    int    i;

    d = n / precision;
    i = (int)(d + 0.500000001);
    d = (float)(i * precision);

    return d;
}

/** 
  * Rond een getal af op een zelf opgegeven waarde 
  * 
  * @access public 
  * @param  n double    Getal dat moet worden afgerond 
  * @param  r double    De waarde waarop het getal moet worden afgerond 
  * @return double
  * 
  * @example: 
  * customRound(1.24, 0.25); // 1.25 
  * customRound(1.24, 0.10); // 1.2 
  * customRound(1.24, 1);    // 1 
  * 
  * @author Jorgen Horstink <jorgen@webstores.nl> 
  */ 
double customRound(double n, double r) {
  return (round(n / r, 1.0) * r);
}

void main()
{
  printf("%f\n", customRound(1.24, 0.25)); // 1.250000
  printf("%f\n", customRound(1.24, 0.10)); // 1.200000
  printf("%f\n", customRound(1.24, 1.0));  // 1.000000
}


Dit moet je in ieder geval de goede weg op helpen.

[ Voor 46% gewijzigd door Verwijderd op 21-06-2004 14:01 ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Dit werkt ook volgens mij:
C++:
1
2
3
4
double roundVal(double value, double precision)
{
    return floor(value / precision + 0.5) * precision;
}

Bijna hetzelfde als Jorgen's code alleen kun je die 1.0's wel weglaten of wegwerken door / en * te verwisselen. En hier is de functie floor gebruikt zodat je niet heen en weer hoeft te casten van int naar float/double.

Stdio.h en iostream.h heb je hier idd niet voor nodig. Zowieso zijn de .h versies van deze headers verouderd, je hoort nu <iostream> te gebruiken (dus zonder .h). Stdio is eigenlijk voor C, die zul je niet zo gauw nodig hebben maar als je em gebruikt moet je <cstdio> nemen ipv <stdio.h>. Alle oude C headers zijn in C++ vervangen door dezelfde naam zonder .h en met een 'c' ervoor geplakt. Voor jouw code had je geen enkele header nodig. Voor die van mij vanwege floor wel, en die zit in <cmath>.

Verder nog een kleine suggestie: de variabelen in je code wat duidelijkere namen geven, nu is niet echt duidelijk wat welke variabele bevat. En functienamen geheel in hoofdletters schrijven is ook niet echt gebruikelijk, het leest nogal vervelend in een programma.

edit: Ik zie dat Jorgen's code ook op andere preciesie-waarden kan afronden, dat doet deze code niet.

[ Voor 8% gewijzigd door madwizard op 21-06-2004 13:57 ]

www.madwizard.org


Verwijderd

madwizard schreef op 21 juni 2004 @ 13:55:
Dit werkt ook volgens mij:
C++:
1
2
3
4
double roundVal(double value, double precision)
{
    return floor(value / precision + 0.5) * precision;
}

Bijna hetzelfde als Jorgen's code alleen kun je die 1.0's wel weglaten of wegwerken door / en * te verwisselen. En hier is de functie floor gebruikt zodat je niet heen en weer hoeft te casten van int naar float/double.

blaat ;)
Dat besefte ik net ook, dus ik heb even mijn post aangepast... Beetje onzinnig om X / (1 / Y) te doen. Dan kan je net zo goed X*Y doen...

Verwijderd

Topicstarter
@jorgen:

ik heb je code uitgeprobeerd, maar hij rond 5.55 af naar 5.5 en niet naar 5.6.

dit zal je wel nog moeten aanpassen voordat je deze code aan andere mensen geeft.


voor de rest is het idd een stuk betere code.

Verwijderd

1.) Ik moet helemaal niets :(

2.) Die code werkt gewoon naar behoren.

code:
1
2
printf("%f\n", customRound(5.55, 0.1)); // 5.600000
printf("%f\n", round(5.55, 0.1)); // 5.600000


Code functies round en customRound

[ Voor 58% gewijzigd door Verwijderd op 21-06-2004 14:56 ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Er is trouwens nog wel een goede reden om floor te gebruiken in plaats van een cast naar een int, namelijk dat een int maar half zo groot is als een double (nog afgezien van de compleet andere structuur). Bij grote getallen (of beter gezegd: veel significante cijfers) kom je dan in de problemen:
C++:
1
2
3
4
5
6
7
8
9
10
11
double waarde = 567890123456.0;
cout << setprecision(15);
cout << "Waarde:      " << waarde                  << endl;
cout << "roundVal:    " << roundVal(waarde, 10)    << endl;
cout << "customRound: " << customRound(waarde, 10) << endl;

/* Resultaat:
    Waarde:      567890123456
    roundVal:    567890123460
    customRound: 9544374980
*/

Hier is de double te groot om in de int te passen en gaat ie de mist in.

[ Voor 33% gewijzigd door madwizard op 21-06-2004 15:13 ]

www.madwizard.org


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Overigens is een cast naar int niet hetzelfde als floor. Een cast geeft namelijk alleen het integer gedeelte terug, dus (int)-0.5 geeft 0. Echter, floor (-0.5) = -1

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1