Sida 1 av 1

Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 09:32:41
av Repaterion
Hejsan.

Sitter med ett gruppprojekt i skolan och funderar på vilket som är snabbast eller effektivaste sättet att hantera flyttal/float på ATMega328.
Sitter i Arduino IDE för detta.
Det "vanliga sättet"

float bananer = 0.00;
alternativet
uint16_t bananer = 0; och använda 1000tal till dessa det skall göra om till ett decimaltal på 3 siffror, man tappar säkert en del i precision att göra så här.
Men det skall mätas vindhastighet så nhaaa, 12,35 eller 12,38 är skit samma i detta fall.

I Ardu IDE Så är detta program 4KB.... iom alla floatar och float är trögt att räkna.
Ser ett fel nu tror jag, windData är uint8_t och sedan float, hade bekymmer med att jag inte fick ut decimalerna ett tag.
Dessutom är windData upp till 324 inte ens tyskland superinflation får in det i ett 8b variabel. :lol:

Visst skulle jag kunna stånga mig i genom detta i C men vet inte om det är värt det när det skall ADC omvandlas ett värde och skicka detta oftare 1/sek,
denna data skickas senare till en RPi/Python som sköter resten med utdata på skärm/konsol just nu.

Kod: Markera allt

int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 8;      // select the pin for the LED
uint16_t sensorValue = 0;  // variable to store the value coming from the sensor
uint8_t windData = 0;
float outputWindData = 0.0;
uint16_t sensorData = 0;


void setup() {
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin, OUTPUT);

  //Seriekommunikation för väderdata. TEMPORÄR FÖR ATT SENARE ANPASSAS.
  Serial.begin(9600);
  
}

void loop() {
  // read the value from the sensor: ANEMOMETERN
  sensorData = analogRead(sensorPin);
  sensorValue = constrain(sensorData, 200, 750);
    
  
  // stop the program for <sensorValue> milliseconds:
  //delay(sensorValue);
  //Serial.println(sensorValue);
  float windData = map(sensorValue, 200, 750, 0, 342);
  float outputWindData = float(windData/10);
  digitalWrite(ledPin,HIGH);
  Serial.print(outputWindData);
  Serial.println(" m/S");
  delay(125);
  digitalWrite(ledPin,LOW);
  delay(125);
}

Re: Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 09:39:11
av AndLi
Vad är frågan?

Kör int och fixa till decimalerna vid presentation...

Eller släng mer hårdvara på problemet, det verkar vara så kidsen jobbar idag...

Re: Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 10:56:44
av hawkan
Det är knappt något räknande. Det kan knappast vara floatens fel om detta programmet går trögt.

Re: Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 10:56:56
av Wihelm
Använd heltals decimaler.
https://github.com/Pharap/FixedPointsArduino

Sök efter fixedpoints i arduino IDE library manager

Re: Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 11:32:48
av Repaterion
AndLi skrev: 10 september 2022, 09:39:11 Vad är frågan?

Kör int och fixa till decimalerna vid presentation...

Eller släng mer hårdvara på problemet, det verkar vara så kidsen jobbar idag...
Frågan? Vilket går snabbast, beräkna stora heltal eller flyttal.
Det är så politiker löser problemen med, mer pengar så löser sig allt i stället för att lösa grundproblemet.

Re: Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 11:33:49
av Repaterion
hawkan skrev: 10 september 2022, 10:56:44 Det är knappt något räknande. Det kan knappast vara floatens fel om detta programmet går trögt.
Trögt går det inte, utan det jag menade var att det är trögare att jobba med flyttal än heltal binärt, framför allt tar det mer minne programmässigt.

Re: Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 11:34:09
av Repaterion
Wihelm skrev: 10 september 2022, 10:56:56 Använd heltals decimaler.
https://github.com/Pharap/FixedPointsArduino

Sök efter fixedpoints i arduino IDE library manager
Skall titta på den. =D

Re: Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 13:07:05
av AndLi
Repaterion skrev: 10 september 2022, 11:32:48
AndLi skrev: 10 september 2022, 09:39:11 Vad är frågan?

Kör int och fixa till decimalerna vid presentation...

Eller släng mer hårdvara på problemet, det verkar vara så kidsen jobbar idag...
Frågan? Vilket går snabbast, beräkna stora heltal eller flyttal.
Det är så politiker löser problemen med, mer pengar så löser sig allt i stället för att lösa grundproblemet.
Heltal går alltid snabbare.

Re: Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 13:34:18
av xxargs
Det beror också på om det finns flyttals-coprocessor eller instruktioner i använda CPU:n - skulle tro att de flesta CPU-miljöer som orka dra runt en Linux anständigt idag har flyttals-instruktioner och då är det inte nödvändigtvis att int, long in, long long int går så mycket fortare än en float/double operation - speciellt inte nu när det är 64 bits ordbredd i dagens lite större CPU som ARM.

mycket av tiden är ju inte att göra själva operationen utan att hämta in data och skicka iväg resultatet någonstans och är det en long int så är det 32-bit och är det long long int så är det 64 bit i regel.

long int och (singel precision) float är båda 32 bitar långa

många tuggor att hämta och skicka på en 8 eller 16 bits propp.

Re: Effektivaste sättet med FLOAT.

Postat: 10 september 2022, 15:14:02
av Klas-Kenny
Med tanke på att programmet innehåller:

Kod: Markera allt

delay(125);
Så tror jag att prestandaskillnaden mellan heltal och flyttal i detta fall är försumbar.


Men visst är det generellt så att heltal går snabbare i småprocessorer.
Många gånger är det lite mera förutsägbart med heltal också (man slipper fenomen som att ½ plötsligt kan bli 0.500000000000000001), och om man ska skicka det över någon databuss kan det vara tacksamt med heltal - lättare att läsa i binär/hexformat vid felsökning.

Re: Effektivaste sättet med FLOAT.

Postat: 11 september 2022, 15:08:23
av Repaterion
Jo delay är väll inte det effektivaste sättet, bättre att använder timer1 i CNC eller liknande och gör en egen funktion för led blink, den kanske inte ens implementeras sedan.
Ja bråk eller vissa delningar kan ställa till det ja. Python och 1,1 + 1,2 ger ju 1,2999999999999999995 eller nåt liknande.

Re: Effektivaste sättet med FLOAT.

Postat: 11 september 2022, 18:11:08
av Klas-Kenny
Delay behöver ju inte vara *fel*, om man ändå inte har något annat att göra under tiden spelar det ju ingen större roll.

Men om man nu ändå har så mycket tid över lär de extra instruktionerna för flyttalsberäkningar inte spela någon större roll.