Sdílet prostřednictvím


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.

Viz také

Koncepty

Optimalizace kódu