Rare uitkomst die 2 lager ligt dan verwacht...

algemene C code
Berichten: 30
Geregistreerd: 14 Dec 2018, 14:39

Rare uitkomst die 2 lager ligt dan verwacht...

Berichtdoor FTMZ » 20 Sep 2020, 17:25

Hallo mensen,
Ik was mijn zondag aan het vullen met wat experimenten met machtsverheffingen.

Ik had met mij beperkte kennis een programma geschreven wat echter een andere waarde geeft dan verwacht:

Code: Alles selecteren
int y;
int z;

void setup() {
  Serial.begin (9600); 
}

void loop() {
  // put your main code here, to run repeatedly:
delay (4000);
while (1==1)
{
  for (z = 1 ; z <= 8 ; z++)
  {y = y * 2;
   int x = y;                                       //(y + 2); kan ik hiermee verdoezelen
   Serial.print (x);
   Serial.print (" = 2 tot de macht ");
   Serial.println (z);
   y++;
   delay (1000);
  }
  y = 0;
}

}

Allereerst krijg ik de volgende uitkomsten op de serial monitor:

0 = 2 tot de macht 1
2 = 2 tot de macht 2
6 = 2 tot de macht 3
14 = 2 tot de macht 4
30 = 2 tot de macht 5
62 = 2 tot de macht 6
126 = 2 tot de macht 7
254 = 2 tot de macht 8


Daarbij komen 2 vragen bij me op...
Waarom is de uitkomst 2 lager dan ik zou verwachten?
En waarom (ik was wat aan het finetunen en experimenteren) werkt het ondanks dat ik variabele y 0 maak.
0 x 2 is nog altijd 0 en het programma zou nooit van de grond kunnen komen...

Ik heb het wel werkend hoor. Ik kan smokkelen door 2 op te tellen bij y, maar dan blijft mijn vraag staan...
Hoe kan dit zo lopen? :roll:

Advertisement

Gebruikers-avatar
Berichten: 619
Geregistreerd: 15 Nov 2015, 11:54

Re: Rare uitkomst die 2 lager ligt dan verwacht...

Berichtdoor Gij Kieken » 20 Sep 2020, 18:00

Jij doet geen machtsverheffing pow(base, exponent), je vermenigvuldigd enkel.

Berichten: 3959
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Rare uitkomst die 2 lager ligt dan verwacht...

Berichtdoor shooter » 20 Sep 2020, 20:37

2 macht 3 is 2x2x2
2 macht 4 is 2x2x2x2 enzovoort dus rekenfout
begin gewoon telkens opnieuw dan weet je gewoon dat het goed gaat.
paul deelen
shooter@home.nl

Berichten: 30
Geregistreerd: 14 Dec 2018, 14:39

Re: Rare uitkomst die 2 lager ligt dan verwacht...

Berichtdoor FTMZ » 20 Sep 2020, 20:59

Waarom is dit geen machtsverheffing?
Ik heb een For-loop die bepaalt hoevaak ik het getal 2 vermenigvuldig. (daarnaast vermenigvuldig ik dat met 1 (true or false))
Want dat is de insteek. Ik wil het getal 2 tot in de 8e macht kunnen verheffen.

Bij gebrek aan een C++ code daarvoor, heb ik het met een For loop gedaan, waarbij elke loop de "x2" een keer vaker voorkomt.
Misschien een definitieverschil. Maar in mijn optiek is dat machtsverheffen.

Maar goed... Dat is niet het punt.
Het gaat me erom dat ik een waarde Y heb, die een Z aantal keren vermenigvuldigd wordt met 2.
De variabele die ik daarvoor gebruik, Y, is initieel 0. En dat is vreemd omdat je een getal niet kunt vermenigvuldigen met 0, want dat zou altijd 0 zijn.
Maar OK... Of ik nu Y = 0 kies of Y = 1, dat maakt niets uit, vreemd genoeg.

De uitkomst is:
0 = 1 x 2
2 = 1 x 2 x 2
6 = 1 x 2 x 2 x 2
14 = 1 x 2 x 2 x 2 x 2.
enz...

Hoe kan het dat de antwoorden steevast 2 lager uitvallen? Daar kan ik niet achter komen.
Ik kan het probleem wel oplossen door er 2 bij elk antwoord bij op te tellen, maar dan weet ik nog niet waar het fout gaat.

Gebruikers-avatar
Berichten: 619
Geregistreerd: 15 Nov 2015, 11:54

Re: Rare uitkomst die 2 lager ligt dan verwacht...

Berichtdoor Gij Kieken » 20 Sep 2020, 22:14

Binnen jouw for loop is
y initeeel 0
dus de eerste keer door de loop (z=1)
z gebruik je overigens gewoon als een variabel die telkens met 1 verhoogt
je start bij 1 en eindigt bij 8 ,rekenkundig doe je er anders niet veel mee
Dus de eerste keer door je loop
y=0 maal 2 ---> y blijft dus 0
x zet je gelijk aan y dus x is 0
dan schrijf je maar wat ( je kunt zowel schrijven bananen zijn groenten)
maw het houd geen steek.
daar achter print je de waarde van variabel z,de eerste keer dus 1
je verhoogt y met 1
Tweede keer door de loop
y=1 maal 2, 2 dus
weer stel x=y ,2 dus
ondertussen is z 2 geworden en dat print je ook
y verhoog je met 1 ,3 dus
Derde keer door de loop
y=3 maal 2, 6 dus
...
...
y verhoog je weer met 1 ,7 dus
Vierde keer door de loop
van nu af aan weet je het al zeker?

Dus het heeft op die manier eigenlijk niets te maken met machtsverheffen.

Berichten: 30
Geregistreerd: 14 Dec 2018, 14:39

Re: Rare uitkomst die 2 lager ligt dan verwacht...

Berichtdoor FTMZ » 24 Sep 2020, 21:50

Nou... Het gaat heel anders...
Code: Alles selecteren
 for (z = 1 ; z <= 8 ; z++)                        //8 loopjes van 0 t/m 7 right?
  {y = y * 2;                                             //waarde y = initieel ergens 1. Waarom weet ik niet. Maar het is zo... Dus wordt die hier 2 in deze loop
   int x = y;                                              //x neemt de waarde van y over. Daar heb ik een reden voor. Deze waarde heb ik later weer nodig.
   Serial.print (x);                                     //ter controle print ik het geheel. "X = 2 tot de macht Z"
   Serial.print (" = 2 tot de macht ");          //Omdat Z op de achtergrond (zie eerste regel) elke loop met 1 verhoogt
   Serial.println (z);                                   //is dat mijn exponentie factor.
   y++;
   delay (1000);
  }

Door een voor mij onduidelijke factor bleef de uitkomst altijd 2 te laag.
Dus:
0 = 1 x 2
2 = 1 x 2 x 2
6 = 1 x 2 x 2 x 2
14 = 1 x 2 x 2 x 2 x 2.

Net zo vaag als dat die y altijd al te vermenigvuldigen was, ondanks dat deze 0 kon zijn.


Inmiddels weet ik dat ik niet 2 tekort kwam, maar dat de beoogde waarde op 2 na verdubbeld was.
Lastig uit te leggen.
Ik heb het her en der aangepast. Dit kwam me veel te onbetrouwbaar over.

Oh... En wat de definitie van exponentieel betreft:
Exponentiële groei is een wiskundige term die een toename aangeeft evenredig aan de eigen omvang. Iedere grootheid die elk jaar (of elke maand, dag, uur, etc.) met hetzelfde percentage groeit, ondergaat een exponentiële groei.

Dus een verdubbeling per cyclus.

Gebruikers-avatar
Berichten: 240
Geregistreerd: 22 Jan 2013, 16:40

Re: Rare uitkomst die 2 lager ligt dan verwacht...

Berichtdoor zuid » 25 Sep 2020, 08:58

Wat ging er volgens mij fout:

Als je start met een y=0 blijft de uitkomst van de vermenigvuldiging altijd 0
Dit LIJKT opgelost te worden door de y++.
Maar hierdoor wordt de uitkomst van de vermenigvuldiging 0 * 2 = 0 + 1 = 1 en vervolgens 1 * 2 = 2 +1 = 3.
Als je dit weer met twee vermenigvuldigt krijg je dus 6

Een beter oplossing is direct na de while toevoegen int y = 1
En dus de y++ weg laten.
y mag dus NIET starten met 0.

m.v.g. Nico

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Rare uitkomst die 2 lager ligt dan verwacht...

Berichtdoor Koepel » 25 Sep 2020, 15:19

Een sketch om machtsverheffingen in een iteratie te doen, met het motto: "if you can do it, you can overdo it".

Code: Alles selecteren
// Test machtverheffen in een iteratie
// Library: https://github.com/nickgammon/BigNumber
// Met een Arduino Uno


#include <BigNumber.h>

BigNumber count(0);   // count = 0
BigNumber result(1);  // result = 1

void setup()
{
  Serial.begin( 9600);
  Serial.println();
  Serial.println( "--------------------");
  Serial.println( "De sketch is gestart");
  Serial.println( "--------------------");

  BigNumber::begin();         // optional parameter is length of BigNumber
  BigNumber::setScale( 0);    // no decimals, only integer numbers
}

void loop()
{
  Serial.print( result);
  Serial.print( " = 2 tot de macht ");
  Serial.print( count);
  Serial.println();

  // calculate next result
  result *= 2;       // result = result * 2
  count += 1;        // count = count + 1
}


Dus 2^1000 is "10 715 086 071 862 673 209 484 250 490 600 018 105 614 048 117 055 336 074 437 503 883 703 510 511 249 361 224 931 983 788 156 958 581 275 946 729 175 531 468 251 871 452 856 923 140 435 984 577 574 698 574 803 934 567 774 824 230 985 421 074 605 062 371 141 877 954 182 153 046 474 983 581 941 267 398 767 559 165 543 946 077 062 914 571 196 477 686 542 167 660 429 831 652 624 386 837 205 668 069 376".
Hmmm, interessant hoor. Hoe spreek je dat uit ?
Dus 2 tot de macht 1000 lukt nog, de sketch lijkt vast te lopen bij 1781. Dan heeft de BigNumber waarschijnlijk te weinig geheugen in de Arduino Uno.

Een sketch op een andere manier:
Code: Alles selecteren
// Test machtverheffen in een iteratie
// Met de Arduino bitSet()
// Met een Arduino Uno

int count = 0;

void setup()
{
  Serial.begin( 9600);
  Serial.println();
  Serial.println( "####################");
  Serial.println( "De sketch is gestart");
  Serial.println( "####################");
}

void loop()
{
  unsigned long result = 0;
  bitSet( result, count);

  Serial.print( result);
  Serial.print( " = 2 tot de macht ");
  Serial.print( count);
  Serial.println();

  count++;
  if( count >= 32)
  {
    Serial.println( "####################");
    count = 0;
  }
}


Bij deze sketch is geen iteratie nodig. De macht van twee wordt meteen gezet als het juiste bitje wordt gezet.

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten