Citat:
Ursprungligen postat av
smellyproof
Ska skriva en funktion som tar emot två flyttal och kollar om de är lika stora. Om de är lika stora ska true returneras annars false.
Vad är fel med denna kod? Den verkar alltid returerna 0 alltså false.
Kod:
float flyttal(float tal1, float tal2)
{
if (tal1 == tal2)
return 1;
else
return 0;
}
Inget fel med koden, förutom "==" eftersom flyttal är inexakta istället för att kunna rinna under/över. Det ger mig en lugnande känsla i skrevet att kunna använda värden utan att bry mig om för stora eller för små värden, och dessutom kunna använda decimaler, men flyttal är tyvärr fortfarande lagrade i ett ändligt antal byte.
Ju större tal desto större inexakthet, men under en viss gräns tror jag att ett heltal lagrat i flyttalsform är OK att jämföra med ett annat eftersom de alltid (?) lagras som: ett tecken (plus eller minus), ett heltal och en exponent. Men huruvida t.ex. `sqrt(81.0) == 9.0` alltid går att lita på har jag inte lyckats få svar på ens på Stack Overflow.
För att jämföra flyttal, som är smittade av inexakthet, måste du veta hur smittade de maximalt kan vara, vilket beror på vilka operationer du har utfört på dem tidigare, och välja en gräns där de anses vara lika. En funktion som ska jämföra två flyttal borde nog ha ett tredje argument: den tillåtna felmarginalen.
Felet kan vara positivt eller negativt, så ett sätt är att använda funktionen abs() från matematikbiblioteket och göra det positivt, sen jämföra det m.h.a. operatorerna "<=" eller ">=" (eller blir det "<" och ">"?) med ett konstant positivt värde. Kom ihåg att inkludera <math.h> och länka till matematikbiblioteket. Det är det enda bibliotek inbyggt i C som kompilatorer inte länkar till automatiskt.
Nej, skit i matematikbiblioteket, det kanske inte är tillgängligt på en begränsad enchipsdator och är inte värt att kräva bara för detta problem. En egen abs()-funktion skiver man hur lätt som helst.
PS: "double" är egentligen den naturliga flyttalstypen i C. Den är motsvarigheten till heltalens "int", den typ som processorn kan arbeta med snabbast.