Proč desetinná čísla ztratit Precision
Desetinná čísla s plovoucí desetinnou čárkou obecně nemají přesné binární reprezentaci.Toto je vedlejším účinkem jak CPU představuje plovoucí datový bod.Z tohoto důvodu může dojít ke ztrátě některých přesnost a některé operace s plovoucí desetinnou čárkou mohou vést k neočekávaným výsledkům.
Toto chování je výsledek jednoho z následujících:
Binární podobu desetinné číslo nemusí být přesná.
Mezi čísla používá (například směšovací float a dvojité) je neshoda typu.
Chování vyřešíte většině programátorů, buď zajistí, že hodnota je větší nebo menší, než co je nezbytné nebo jejich získání a použití knihovny Binary Coded Decimal (BCD), který bude udržovat přesnost.
Binární reprezentaci hodnot s plovoucí čárkou ovlivňuje přesnost a správnost výpočtů s plovoucí desetinnou čárkou.Microsoft Visual C++, používá IEEE 8bajtové formátu.
Příklad
// Floating-point_number_precision.c
// Compile options needed: none. Value of c is printed with a decimal
// point precision of 10 and 6 (printf rounded value by default) to
// show the difference
#include <stdio.h>
#define EPSILON 0.0001 // Define your own tolerance
#define FLOAT_EQ(x,v) (((v - EPSILON) < x) && (x <( v + EPSILON)))
int main() {
float a, b, c;
a = 1.345f;
b = 1.123f;
c = a + b;
// if (FLOAT_EQ(c, 2.468)) // Remove comment for correct result
if (c == 2.468) // Comment this line for correct result
printf_s("They are equal.\n");
else
printf_s("They are not equal! The value of c is %13.10f "
"or %f",c,c);
}
Komentáře
EPSILON, můžete použít konstanty FLT_EPSILON, který je definován pro plovoucí jako 1.192092896e-07F, nebo DBL_EPSILON, který je definován pro dvojitou jako 2.2204460492503131e-016.Je nutné zahrnout tyto konstanty float.h.Tyto konstanty jsou definovány jako nejmenší kladné číslo x, x + 1.0 není roven 1,0.Protože je velmi malé číslo, by měly používat uživatelem definované tolerance pro výpočty s velmi velkých čísel.