Citat:
Lär dig fokusera på frågan...
Jag ser inga inbyggda system med 64 bitar, släpp dina extrema militära exempel, vanliga industriella tillämpningar är normen. 7 decimaler är ganska mycket för de flesta styrsystem och 32 bitars FPU verkar vara normen.
När jag läser om t.ex. simulink coder som genererar kod rekommenderas float eftersom det oftast räcker.
Jag ser inga inbyggda system med 64 bitar, släpp dina extrema militära exempel, vanliga industriella tillämpningar är normen. 7 decimaler är ganska mycket för de flesta styrsystem och 32 bitars FPU verkar vara normen.
När jag läser om t.ex. simulink coder som genererar kod rekommenderas float eftersom det oftast räcker.
Aha, det snappade jag ju inte. Jag tog fram de militära exemplena pga att de är typexemplet på tunga beräkningsalgoritmer som måste gå fort. Och feltoleransen är liten.
Tänkte att mina utvikningar om att flyttalsberäkningar inte är så självklart som man kan tro kanske intresserar den allmänt intresserade datornörden här


Nu har ju inbyggda system, sk embedded systems blivit ett så generellt flytande (floating

Så jag är inte hemma på vad du försöker sno ihop för programvara.
Ursäkta svamlet om kineser med kulramar men det är ett (gammalt) standardskämt i den tekniska världen.
Du refererar i trådstarten till den här artikeln:
https://www.geeksforgeeks.org/catch-...nversion-in-c/
Vilket inte säger mig ett dugg, tyvärr. Det är typ standard test av exception, inte något med skillnaden mellan 32-bits floats och 64-bits doubles för någon FPUs hastighet.
Är du säker på att 32-bits float räcker så är det bara att köra på det ju.
Tänk dock på att felpropageringen kan bli betydande redan efter ett (litet) antal float operationer.
Du sätter ju parametrarna i kompilatorn att den ska kompilera för en 32-bits CPU.
Men tycker att din FPU bör utan vidare klara av 64-bits doubles.
Och det med god hastighet.
Jag har ju ingen aning om hur fort det måste gå, det handlar ju om att du måste veta på ett ungefär om du kan tåla de extra mikrosekunder det kan handla om.
Inne i CPU/FPU/GPUn sker allting mycket fortare än det du kan se på skärmen.
Grafiken på en vanlig skärm är väl ungefär 1-10 miljoner gånger långsammare än vad som händer inne i en vanlig PC-CPU på 3 GHz.
Din CPU/FPU-modell ska ju ha specifikationer kring sådana flyttalsoperationer och hur snabb den är.
Det är ju klart att om du bygger ett robotpar som ska kunna spela bordtennis mot varandra så vill det till att de kan räkna fram bollbanan fort, förstås.
Ursäkta att jag skrivit ur ett generellt övergripande perspektiv, men du får själv prova dig fram, tills du har något som är körbart.
Om du nu pratar om ett styrsystem, tex en robot så är rörelserna så långsamma att om du räknar floats eller doubles det bör inte ha någon betydelse. Om det nu inte är en jäkligt långsam CPU/FPU du har, typ...
Här står det om tex Raspberry Pis (ett vanligt "inbyggt system") prestanda på flyttal:
https://stackoverflow.com/questions/...oint-operation
Raspberry Pi 3 står sig mycket bra och hinner klara av 1 miljon flyttalsoperationer på 0,013 millisekunder, vad man kan lära sig av diagrammet.
Här finns en utläggning om doubles jämfört floats och 32-bit float kan tvärtom gå långsammare eftersom chipet måste konvertera i varje steg, tyvärr:
https://stackoverflow.com/questions/...hich-is-faster
Citat:
Eftersom jag inte vilken FPU som sitter i ditt inbyggda system så är frågan om floats eller doubles en fråga som jag inte kan svara på.
I can think of two basic cases when doubles are faster than floats:
Your hardware supports double operations but not float operations, so floats will be emulated by software and therefore be slower.
You really need the precision of doubles. Now, if you use floats anyway you will have to use two floats to reach similar precision to double. The emulation of a true double with floats will be slower than using floats in the first place.
You do not necessarily need doubles but your numeric algorithm converges faster due to the enhanced precision of doubles. Also, doubles might offer enough precision to use a faster but numerically less stable algorithm at all.
For completeness' sake I also give some reasons for the opposite case of floats being faster. You can see for yourself whichs reasons dominate in your case:
Floats are faster than doubles when you don't need double's precision and you are memory-bandwidth bound and your hardware doesn't carry a penalty on floats.
They conserve memory-bandwidth because they occupy half the space per number.
There are also platforms that can process more floats than doubles in parallel.
Your hardware supports double operations but not float operations, so floats will be emulated by software and therefore be slower.
You really need the precision of doubles. Now, if you use floats anyway you will have to use two floats to reach similar precision to double. The emulation of a true double with floats will be slower than using floats in the first place.
You do not necessarily need doubles but your numeric algorithm converges faster due to the enhanced precision of doubles. Also, doubles might offer enough precision to use a faster but numerically less stable algorithm at all.
For completeness' sake I also give some reasons for the opposite case of floats being faster. You can see for yourself whichs reasons dominate in your case:
Floats are faster than doubles when you don't need double's precision and you are memory-bandwidth bound and your hardware doesn't carry a penalty on floats.
They conserve memory-bandwidth because they occupy half the space per number.
There are also platforms that can process more floats than doubles in parallel.
Du måste helt enkelt mäta själv, om du inte hittar någon spec kring din CPU/FPU som kan klargöra detta. Du måste också ta reda på vilka flaggor, switchar som ska sättas på kompilatorn för att programet ska bli körbart på just din CPU/FPU-modell.
Och x87- serien av FPUer använder 80 bitars sk extended doubles hela tiden (internt):
https://stackoverflow.com/questions/...ecision-number
Och förklarar att 32-bits floats kan gå långsammare pga konverteringssteget ifrån 80-bits till 32-bits.
Det är därför man har dissat 32-bits floats i de flesta vanliga sammanhang.
Här finns en mycket fyllig artikel om flyttal och dess fallgropar, och sett ur ett vetenskapligt perspektiv. Den tar även upp sådana udda frågor om flyttal i andra talsystem än de binära eller decimala:
https://docs.oracle.com/cd/E19957-01..._goldberg.html
Artikeln är mycket teoretiskt lagd. Och är väl överkurs för de som inte vill dyka ner i det numeriska träsket. Men som ändå har mycket stor betydelse för vetenskapliga framgångar.
Anledning till att använda binär representation av flyttal är att det är den allra snabbaste metoden att genomföra sådana operationer.
Men i tex handhållna miniräknare så används istället i allmänhet en variant av decimalrepresentation. Den vanligaste är tex BCD, Binary Coded Decimal, dvs fyra bitar representerar siffrorna 0-9. Och som mest används i ekonomiska system. Där kronor och ören måste gå jämnt ut.
BTW: Ursäkta för OT, återkom gärna med vad för CPU/FPU du utvecklar på. Är inte säker på att jag ids och har tid att svara på fler frågeställningar dock. Och regel nr 1 mät först och optimera sedan. Går ditt program för långsamt för en PC, ja då är det nog inte så mycket bevänt att kompilera om det för ett inbyggt system med ännu sämre prestanda. Du måste ha plats i minnet för dels ditt program, eventuellt OS, plus allt minne du behöver allokera.
Vad som dessutom gäller för inbyggda system är att de är svåra att debugga. Särskilt realtidssystem, där svarstider är kritiska osv. Och om det finns tex asynkrona enheter mm.
Debugging måste ske med andra tekniker än de som vanligen lärs ut.
Istället så skriver man gärna en emulator (simulator) på en PC som efterliknar ditt inbyggda system. En emulator, dvs en programvara som speglar det inbyggda systemet på ett realistiskt sätt, kan debuggas som vanligt.
__________________
Senast redigerad av AnalAnalfabeten 2020-08-09 kl. 02:32.
Senast redigerad av AnalAnalfabeten 2020-08-09 kl. 02:32.