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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

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

Inlägg av Findecanor »

DanielM skrev: 2 maj 2023, 10:14:59 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
Närmare noll menar du? ;)
Det finns en grupp IEEE-754 - flyttal väldigt nära 0 som kallas för "subnormal numbers" (på engelska).
De har en något annorlunda representation än andra flyttal, och det är inte alla flyttalsprocessorer (eller mjukvaru-flyttal) som stödjer dem. Jag tror inte ens att alla flyttalsinstruktioner på x86 klarar av dem och vissa instruktioner går märkbart långsammare när resultatet blir väldigt nära noll, så stöd för dem brukar också gå att stänga av. (vilket kallas "flush to zero")

Eftersom skalan bestäms av exponenten så är minsta talet du kan använda förstås större ju större exponent på det du använder på är. T.ex. adderar du FLT_EPSILON till ett tal något större än 1.0 kommer det inte att rubbas.

Att kolla om två tal efter en uträkning är i praktiken lika är vad epsilon-konstanter är till för:
fabs(x - y) < FLT_EPSILON.
Man ska aldrig använda "==" - operatorn med flyttal eftersom det sällan blir helt exakt. (förutom i test-kod)
Men i numeriska metoder kan det finnas en risk att du använder ett för högt tröskelvärde, och att det aldrig kommer att gå ut.
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

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

Inlägg av mankan »

Inte ens i testkod blir flyttalsberäkningar exakta. Det beror på CPU och kompilatorflaggor samt kringliggande kod. Har sprungit in det på jobbet med x86_64 och AVX(2 och 512)-instruktioner.
bus
Inlägg: 27
Blev medlem: 21 november 2014, 08:41:37

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

Inlägg av bus »

Det beror väl på vilken typ av värden du hanterar. Om du till exempel håller på med högvacuum system så startar man på atmosfär 1e3 mBar för atmosfärstryck och sen kanske slutar sin process vid 1e-9 mBar.
Om man övervakar spänning på ett batteri så rör du dig max en tiopotens. Använder du 32bit eller 64bit float?
agehall
Inlägg: 418
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 »

Floats är väl typiskt sett alltid 32-bitar? Är det 64-bitar i flyttalet är det ju en double.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg av sodjan »

Både "float" och "double float" (eller vilket annat format som helst) är så klart flyttal.
Sen att många programmeringsspråk har en lite förvirrande namnsättning på typerna är en annan sak.
Och flyttal kan ha nästan vilket antal bitar som helst, både i mantissa och exponent.
agehall
Inlägg: 418
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 »

Finns inga ”double float” i C. Det är double eller float (eller long double). På de arkitekturer jag har använt floats har de iallafall varit 32 bitar medan long är 64 bitar. Kan säkert finnas arkitekturer där de är större, men jag känner inte till någon på rak arm.
MiaM
Inlägg: 9903
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 »

Med moderna processorer, alltså de vi haft de senaste kanske 30 åren, så lär väl float nästan alltid vara 32 bitar och double 64 bitar.

Men givetvis så har de andra bredder för äldre processorer. Dels fanns för riktigt länge sen processorer vars ordlängd inte var jämnt delbar med 8. T.ex. hade DEC 18-bitars och 36-bitars-system. (Se för övrigt aprilskämt-RFC:n kring UTF-9 för att koda unicode på dessa maskiner :mrgreen: ). Men kanske något mer relevant så finns det sannolikt flyttal som är 16-bitars på äldre klenare maskiner.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg av sodjan »

Ja, det var det jag menade, att C har ett förvirrande sätt att namnge typerna.
Och oavsett vad de heter så är de alla flyttal.

IEEE-754 har 8 olika flyttalsformat, 5 binära och 3 decimala.
Användarvisningsbild
rvl
Inlägg: 5719
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

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

Inlägg av rvl »

Ett par exempel på små:
16-bit Half (float) 8-bit Minifloat.
https://en.wikipedia.org/wiki/IEEE_754

Men är inte alla överens om att oberoende av exakt vad man vill kalla dem, så ÄR de flyttal?
agehall
Inlägg: 418
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 »

Ja, flyttal är de alla. Dock rör ju denna tråd specifikt floats i C.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

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

Inlägg av Mr Andersson »

Alla floats är doubles. Specifikt i C.
agehall
Inlägg: 418
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 »

Nej. Float är ett subset av double. Det är inte samma sak som att en float är en double.

Testa att köra

Kod: Markera allt

#include <stdio.h>

int main()
{
    float f;
    double d;
   
    printf("Float is size %d\n", sizeof(f));
    printf("Double size is %d\n", sizeof(d));
}
så ser du att de har olika storlek. Bara för att du kan representera alla float som en double så är de inte samma sak.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg av sodjan »

Båda är "flyttal" eller "floating point".
Sen att namnen på formaten i C är lite förvirrande, tja det bara är så...
Sen, vad Mr Anderssin menade vet jag inte. Men visst, alla värden som datatypen "float" kan representera i C, borde även kunna representeras som datatypen "double".

Det förvirrande är att "float" har en specifik betydelse i C, medan "floating point" är ett mer generellt begrepp.
agehall
Inlägg: 418
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 »

Jag misstänker att Mr Andersson syftar på formuleringen i standarden som säger att alla floats representeras av en double. Det är dock inte samma sak som att en float är en double.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

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

Inlägg av Mr Andersson »

Det var mer menat som ett geekskämt om otydligheterna i standarden men det verkar inte ha gått hem.
Vad standarden menar är vad agehall sa. Alla floats ska gå att exakt representera i double. Vad de skriver är en annan sak.
Ordagrant är float ett subset av double, på samma sätt som heltal är ett subset av reella tal. Ie. alla heltal är reella tal, men alla reella tal är inte heltal.
Skriv svar