Effektivaste sättet med FLOAT.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Effektivaste sättet med FLOAT.

Inlägg 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);
}
Användarvisningsbild
AndLi
Inlägg: 17050
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Effektivaste sättet med FLOAT.

Inlägg 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...
Användarvisningsbild
hawkan
Inlägg: 2586
Blev medlem: 14 augusti 2011, 10:27:40

Re: Effektivaste sättet med FLOAT.

Inlägg av hawkan »

Det är knappt något räknande. Det kan knappast vara floatens fel om detta programmet går trögt.
Wihelm
Inlägg: 588
Blev medlem: 18 juni 2019, 17:30:19
Ort: Nybro

Re: Effektivaste sättet med FLOAT.

Inlägg av Wihelm »

Använd heltals decimaler.
https://github.com/Pharap/FixedPointsArduino

Sök efter fixedpoints i arduino IDE library manager
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: Effektivaste sättet med FLOAT.

Inlägg 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.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: Effektivaste sättet med FLOAT.

Inlägg 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.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: Effektivaste sättet med FLOAT.

Inlägg 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
Användarvisningsbild
AndLi
Inlägg: 17050
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Effektivaste sättet med FLOAT.

Inlägg 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.
xxargs
Inlägg: 10183
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Effektivaste sättet med FLOAT.

Inlägg 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.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Effektivaste sättet med FLOAT.

Inlägg 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.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: Effektivaste sättet med FLOAT.

Inlägg 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.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Effektivaste sättet med FLOAT.

Inlägg 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.
Skriv svar