Arduino random function type casts

OP #5776581
Lesenswert?

Ich verstehe nicht, was bei folgendem Programm passiert. Da wo 
random(10)-5 negativ wird, werden grosse positive Werte ausgegeben. Bei 
allen auskommentierten Versionen ist das nicht der Fall. Für mich sind 
die grossen positiven Werte nicht erklärbar, zumal es bei anderen 
Schreibweisen keine Probleme gibt. Das ganze läuft auf nem teensy 36.

Hier das Programm zusammen mit der Ausgabe (weiter unten).
1
long RANDOM(int d){
2
  return random(d) ;
3
  }
4
  
5
void setup() {
6
  Serial.begin(115200); 
7
  delay(2000) ;
8
  Serial.print("Hello World 1\n"); 
9
  randomSeed(1);
10
 
11
  for(int k=0 ; k<20 ; k++){ 
12
     
13
     double x=random(10)-5 ; 
14
     
15
     //double x=RANDOM(10)-5 ;
16
     //double x=(int)random(10)-5 ;
17
     //int i=random(10)-5 ; double x=(double)i ;
18
     //long i=random(10)-5 ; double x=(double)i ;
19
     //double x=(long)random(10)-5 ;
20
     Serial.printf("%5d  %15.5f  \n",k,x) ;
21
   }
22
  }
23

24
void loop(){
25
  }  
26

27
/*
28
  Hello World 1
29
    0          2.00000  
30
    1          4.00000  
31
    2  4294967294.00000  
32
    3          3.00000  
33
    4  4294967291.00000  
34
    5  4294967293.00000  
35
    6  4294967295.00000  
36
    7          3.00000  
37
    8  4294967294.00000  
38
    */
#5776882
Lesenswert?

Mangels Arduino und mangels Serial.printf lässt sich dein Code bei mir 
nicht ausprobieren. Ein Test in Tinkercad mit folgendem Code
1
...
2
    double x=random(10)-5 ; 
3
    
4
    Serial.print(k);
5
    Serial.print(", ");
6
    Serial.print(x) ;
7
    Serial.print('\n');
8
...

liefert aber das gewünschte Ergebnis:
1
Hello World 1
2
0, 2.00
3
1, 4.00
4
2, -2.00
5
3, 3.00
6
4, -5.00
7
5, -3.00
8
6, -1.00
9
7, 3.00
10
8, -2.00
11
9, 4.00
12
10, -5.00
13
11, 0.00
14
12, -3.00
15
13, -3.00
16
14, 2.00
17
15, -2.00
18
16, 2.00
19
17, 4.00
20
18, -5.00
21
19, -3.00

Woher kommt denn deine printf-Funktion?

Oliver
#5776898
Lesenswert?

Martin O. schrieb:
> double x=random(10)-5.0f ;
>
> liefert die richtigen (negativen) Werte. 5.0lf ist als Typ nicht
> bekannt.

lf wäre 'long float', also double, aber wenn's mit f funktioniert...

> random liefert laut Dokumentation einen long Wert.

Dann sieht's danach aus, dass die Konvertierung von long nach double 
nicht funktioniert für negative Zahlen.
1
long test = -1;
2
printf("%f", (double) test);
 müsste dann auch das falsche Ergebnis geben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren