Minsta realistiska värdet på en float för inbyggda system i C?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2312
Blev medlem: 5 september 2019, 14:19:58

Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av DanielM »

Jag håller på med optimering och dumt nog så tänker jag applicera detta på inbyggda system.
Matematiken ser ut så här

\(\text{min J } \frac{1}{2}x^TQx + c^Tx\)
\(s.t\)
\(Gx \leq h\)
\(Ax = b\)

Men för att avgöra när jag ska sluta optimera så måste jag jämföra mot ett litet tal. Just nu brukar jag använda FLT_EPSILON = 1.192092896e-07F och orsaken varför jag använder denna har med att kommentaren säger

Kod: Markera allt

#define FLT_EPSILON      1.192092896e-07F        // smallest such that 1.0+FLT_EPSILON != 1.0
Detta betyder, enligt mig att FLT_EPSILON är så litet så att den är på gränsen till att kunna räknas som ett tal som påverkar andra tal.
Eller tänker jag rätt här?
guckrum
Inlägg: 1811
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av guckrum »

Kommentaren säger precis vad det är. Du måste förstå att det handlar om flyttal som har en exponent och en mantissa. Ditt epsilon är alltså det minsta som ryms i mantissan, och om man loggar lite ser man att det motsvarar precis 23 bitar. Det är en vanlig siffra för 32-bitars float, men kan naturligtvis vara annorlunda på en annan processorarkitektur.
DanielM
Inlägg: 2312
Blev medlem: 5 september 2019, 14:19:58

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av DanielM »

Betyder detta att jag kan ha ett lägre tal än FLT_EPSILON?
För jag tolkar som att tal som är lägre än FLT_EPSILON kommer tolkas som 0.0f
Användarvisningsbild
Icecap
Inlägg: 26449
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av Icecap »

Det betyder att talet är minste möjliga över 1.000000000 + talet.
Talets exata värde beror på Floating Point-rutinen.
Användarvisningsbild
hawkan
Inlägg: 2990
Blev medlem: 14 augusti 2011, 10:27:40

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av hawkan »

Leta efter FLT_MIN för minsta float.
Googla ieee 754 för detaljer kring flyttal.
Använd double om antal värdesiffror är för litet.
Kriteria för när optimering ska vara domänbaserad, dvs problemet i sej självt har en nivå som säger när du nått målet, inte antal värdesiffror.
Shimonu
Inlägg: 300
Blev medlem: 21 oktober 2015, 22:44:33

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av Shimonu »

Minsta skillnaden mellan två flyttal varierar i talrymden, för små tal finns det skillnader mindre än epsilon men för stora tal är det större skillnad än epsilon. För väldigt stora tal börjar det bli tiotals skillnad från ett flyttal till nästa.
DanielM
Inlägg: 2312
Blev medlem: 5 september 2019, 14:19:58

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av DanielM »

Okej. Så man kan ha mindre tal än FLT_EPSILON och jämföra dessa tal med något?
hawkan skrev: 2 maj 2023, 10:45:03 Leta efter FLT_MIN för minsta float.
Googla ieee 754 för detaljer kring flyttal.
Använd double om antal värdesiffror är för litet.
Kriteria för när optimering ska vara domänbaserad, dvs problemet i sej självt har en nivå som säger när du nått målet, inte antal värdesiffror.
Du för gärna förklara vad du menar med "domänbaserad".
Jag mäter bara konvergens och absolutvärden.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av sodjan »

Domänbaserat: Vad som är vettigt i det aktuella fallet.
Och som Shimonu skrev, FLT_EPSILON är bara korrekt nära det absoluta värdet "1".
DanielM
Inlägg: 2312
Blev medlem: 5 september 2019, 14:19:58

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av DanielM »

Så om jag har en if-sats som lyder

Kod: Markera allt

if(1e-8f > 1e-9f){
	/* Satsen kommer köras */
}
Kommer denna if-sats tolka då 1e-8f som noll med tanke på att allt under FLT_EPSILON och + 1 tolkas som 1.
Shimonu
Inlägg: 300
Blev medlem: 21 oktober 2015, 22:44:33

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av Shimonu »

https://www.h-schmidt.net/FloatConverter/IEEE754.html

Lek med den här. Skriv in 0 och tryck på +1, skriv sen in 1 och tryck på +1. Blir det samma skillnad?
agehall
Inlägg: 441
Blev medlem: 12 augusti 2020, 19:27:54

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av agehall »

DanielM skrev: 2 maj 2023, 12:56:01 Kommer denna if-sats tolka då 1e-8f som noll med tanke på att allt under FLT_EPSILON och + 1 tolkas som 1.
Nej. 1e-8f är inte 0.
DanielM
Inlägg: 2312
Blev medlem: 5 september 2019, 14:19:58

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av DanielM »

Jag tänkte om att för låga tal kanske tolkas fel och därmed avrundas till 0.
Bara nyfiken.
mounte
Inlägg: 207
Blev medlem: 14 november 2010, 13:15:00
Ort: Sandviken

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av mounte »

Som Shimonu skrev:
Shimonu skrev: 2 maj 2023, 13:05:14 https://www.h-schmidt.net/FloatConverter/IEEE754.html

Lek med den här. Skriv in 0 och tryck på +1, skriv sen in 1 och tryck på +1. Blir det samma skillnad?
Lägg därtill något i stil med denna skrift: https://blog.demofox.org/2017/11/21/flo ... precision/

Jag tror det forumiterna försöker beskriva är att om du är intresserad av så precis konvergens som din flyttalstyp kan ge dig så beror ditt epsilon på vad du konvergerar mot, eps = f(värde). se: https://en.wikipedia.org/wiki/Machine_epsilon
Om du däremot strävar efter en viss IRL/teknisk konvergens, du optimerar t.ex. en position på en väg och jobbar i storheter om [cm] då väljer du lämpligen ett epsilon som är i storleksordningen [mm] kanske?

Vet inte om det gjorde saken klarare men det är det bästa jag kan ge dig.
Allt väl och god kväll
Användarvisningsbild
MiaM
Inlägg: 11485
Blev medlem: 6 maj 2009, 22:19:19

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av MiaM »

Som andra redan skrivit, flyttal består av mantissa och exponent. Det finns ett minsta möjliga tal som består av mantissa och exponent satt till minsta möjliga värde. Men vilket minsta tal som kan göra inverkan i beräkningar där andra tal ingår påverkas av vilken exponent dessa andra tal har.

Om man t.ex. har 24-bitars mantissa så blir det minsta tal som kan påverka ett större tal cirka 16 miljoner gånger mindre än det större talet. Om du för ett givet större tal vill få fram minsta tal som kan påverka det större talet vid flyttalsberäkningar så får du helt enkelt dela det större talet med 2^24, om du har 24 bitars mantissa. Division med 2^x går alltid jämnt ut då x är heltal, eftersom detta i praktiken resulterar i subtraktion av exponenten.

Reservation för off-by-one. Jag har antagligen tänkt fel ovan, det ska nog vara 8 miljoner gånger mindre och division med 2^23 för att få ett tal som faktiskt kan påverka, medan 16 miljoner gånger mindre och 2^24 är största tal som inte kan påverka. Tror jag. Du får räkna själv.

Det luriga är ungefär att för att klart och tydligt avgöra var dessa gränser mellan påverkande och ej påverkande går så måste man tänka binära tal istället för decimala tal.

Sidospår: Känner inte till om det finns något som använder t.ex. BCD-flyttal eller eventuellt binär mantissa men decimal exponent. Att göra på något av de sätten skulle ge lägre precision vid givet lagringsutrymme för ett tal, men å andra sidan så skulle det kanske (eller kanske inte?) kunna ge några fördelar med avseende på flyttalsrelaterade avrundningsfel. Man skulle nog t.ex. slippa klassikern att en beräkning kommer fram till svaret 6,4999999 istället för 6,5

Annat sidospår: Det känns skönt att nån som har koll på avancerad matte inte nödvändigtvis alltid har koll på flyttal. Jag har antingen glömt eller troligtvis aldrig lärt mig det som beskrivs med formeln i början på tråden, men jag har däremot full koll på flyttal :)
guckrum
Inlägg: 1811
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Minsta realistiska värdet på en float för inbyggda system i C?

Inlägg av guckrum »

Man kan också resonera som så att om man inte har koll på hur målplatformen fungerar kan man inte ta ansvar för resultatet. Lösa antaganden tex om att flyttal är detsamma som reella tal kan leda till katastrof i värsta fall och underliga sidoeffekter i övrigt.

Som killen som skrev Matlabs sparsa matrisfunktioner sa (ur minnet): "If you ever invert a matrix you can be sure of one thing. And that is that you have no idea of what you are doing." I matteböckerna inverterar man matriser hej vilt. I mjukvara körande på floating-point hårdvara - nej. :D
Skriv svar