Sida 1 av 1

Typomvandling i C

Postat: 29 jan 2013, 20:34
av Johnny Rosenberg
Ser att denna del av forumet verkar stendöd för tillfället; inte ett enda inlägg i år, men jag gör ett försök i alla fall.

Håller på med ett litet projekt (i C) som är dömt att misslyckas (mest på grund av att det är jag som ligger bakom…), som vanligt, men skam den som ger sig på ett så här tidigt stadium. Håller just nu på med att knåpa ihop diverse småfunktioner som ska göra livet lite lättare för mig längre fram i projektet, men jag har ännu inte börjat testa dem.

Jag har i alla fall fått lite funderingar på hur och när man måste typomvandla. Förmodligen närhelst man har med flera olika typer att göra samtidigt i samma formel… men man kan ju kanske göra på lite olika sätt. Sedan vill man ju inte att saker ska göras i onödan heller, och fort ska det gå, samtidigt som jag vill vara på den säkra sidan när det gäller precision…

Exempel:

Kod: Markera allt

FLAC__uint64 StartPos, EndPos;
long double AngleStep;
FLAC__uint64 Sample, Index;
const long double TwoPi=6.283185307179586476925287L; // 2π

AngleStep=TwoPi/(long double)(EndPos-StartPos);
Sista raden funderar jag på lite. Är den tillåten, eller måste jag skriva så här?

Kod: Markera allt

AngleStep=TwoPi/((long double)EndPos-(long double)StartPos);
Om båda skrivsätten är tillåtna var min tanke att det första borde gå fortare, dels eftersom jag bara behöver typomvandla en gång, dels eftersom (tror jag) det går fortare att subtrahera två 64-bitars heltal än att subtrahera två extra långa flyttal.

Re: Typomvandling i C

Postat: 30 jan 2013, 10:37
av Konservburk
Jag tror du övertänker. Eftersom TwoPi redan är long double så kommer resultatet av (EndPos-StartPos) att omvandlas till long double innan divisionen utförs oavsett hur du försöker typomvandla. Nöj dig med detta:

Kod: Markera allt

AngleStep = TwoPi / (EndPos - StartPos);

Re: Typomvandling i C

Postat: 02 feb 2013, 18:24
av Johnny Rosenberg
Konservburk skrev:Jag tror du övertänker. Eftersom TwoPi redan är long double så kommer resultatet av (EndPos-StartPos) att omvandlas till long double innan divisionen utförs oavsett hur du försöker typomvandla. Nöj dig med detta:

Kod: Markera allt

AngleStep = TwoPi / (EndPos - StartPos);
Hm… har för mig att jag svarade på denna, men det verkar vara borta nu…
Villa bara tacka för svaret i alla fall. Problemet löst. :)