NaN рдХрд╣рд╛рдБ рд╕реЗ рдЖрддреЗ рд╣реИрдВ?

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ yruslan рдиреЗ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛: "рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред "

рдореИрдВ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╢рд┐рдХреНрд╖рд╛рдкреНрд░рдж рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЬрд┐рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рд╡реЗ рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдорд┐рд▓реЗ рд╣реИрдВред рдЙрддреНрдкрдиреНрди рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рдереАрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдФрд░ рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рд╢рд╛рдпрдж рдореИрдВ рдЕрдм рд╕рд╛рдорд╛рдиреНрдп рд╕рддреНрдп рдмрддрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд▓реЛрдЧ рдпрд╣ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ IEEE754 рдорд╛рдирдХ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред

рд╡рд┐рднрд╛рдЬрди

рд░рд┐рдЯрд░реНрди рдирдВрдмрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рднрд╛рдЬрдХ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ:

if (d != 0.f) result = 1.f / d; 
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рдЧрдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
  float var = 1.f; for (int i = 0; i < 50; i++) { var /= 10.f; float result = 1.f / var; printf("1 / %e = %e\n", var, result); } 

рдФрд░ рдпрд╣рд╛рдБ рдЙрдирдХреЗ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ:
...
1 / 9.999999e-035 = 1.000000e+034
1 / 9.999999e-036 = 1.000000e+035
1 / 9.999999e-037 = 1.000000e+036
1 / 1.000000e-037 = 1.000000e+037
1 / 9.999999e-039 = 1.000000e+038
1 / 1.000000e-039 = 1.#INF00e+000 << тАФ
1 / 9.999946e-041 = 1.#INF00e+000
1 / 9.999666e-042 = 1.#INF00e+000
1 / 1.000527e-042 = 1.#INF00e+000
1 / 9.949219e-044 = 1.#INF00e+000
1 / 9.809089e-045 = 1.#INF00e+000
1 / 1.401298e-045 = 1.#INF00e+000
...

рдирд┐рд░рдВрддрд░ FLT_MIN рдХреЗ рд╕рд╛рде рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рдирд┐рд░рдкреЗрдХреНрд╖ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдЕрдирдВрдд рдХреЛ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдбреЛрдореЗрди рд╕реЗ рдкрд░реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП arccosine function acos () рд▓реЗрдВ, рдЬреЛ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ [-1; 1]ред рдЕрдм рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ рд╡реИрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреЛ рдПрдХреЛрд╕ () рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ рд░реЗрдбрд┐рдпрди рдореЗрдВ рдХреЛрдг рдорд┐рд▓реЗрдЧрд╛ред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рддреЛ, рд╣рдо рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

  float x1 = 10.f; //    float y1 = 1.f; float length1 = sqrt(x1 * x1 + y1 * y1); x1 /= length1; y1 /= length1; //   float x2 = 2.f; //    float y2 = 10.f; float length2 = sqrt(x2 * x2 + y2 * y2); x2 /= length2; y2 /= length2; //   float dotProduct = x1 * x2 + y1 * y2; //    float angle = acos(dotProduct); printf("acos(dotProduct) = %e\n", angle); //     

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рд▓рдЧрднрдЧ рд╕рдорд╛рдирд╛рдВрддрд░ рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:
  for (int i = 0; i < 100; i++) { float x1 = 10.f; float y1 = 5.e-3f * (rand() % 10000) / 10000; //      float length1 = sqrt(x1 * x1 + y1 * y1); x1 /= length1; y1 /= length1; float x2 = 10.f; float y2 = 5.e-3f * (rand() % 10000) / 10000; float length2 = sqrt(x2 * x2 + y2 * y2); x2 /= length2; y2 /= length2; float dotProduct = x1 * x2 + y1 * y2; float angle = acos(dotProduct); printf("dotProduct = %1.8f acos(dotProduct) = %e\n", dotProduct, angle); } 

...
dotProduct = 1.00000000 acos(dotProduct) = 0.000000e+000
dotProduct = 1.00000000 acos(dotProduct) = 0.000000e+000
dotProduct = 0.99999994 acos(dotProduct) = 3.452670e-004
dotProduct = 1.00000012 acos(dotProduct) = -1.#IND00e+000 << NaN
dotProduct = 1.00000000 acos(dotProduct) = 0.000000e+000
dotProduct = 1.00000012 acos(dotProduct) = -1.#IND00e+000 << NaN
...

рдЗрд╕ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, 100 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ 9 рдХреЛрдг рдорд╛рди рдорд┐рд▓реЗ рдЬрд┐рд╕рдореЗрдВ NaN рд╢рд╛рдорд┐рд▓ рдерд╛ред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдпрд╣ рддреНрд░реБрдЯрд┐ рдмрд╣реБрдд рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХреЛрд╕ (рдбреЙрдЯрдкреНрд░реЙрдбрдХреНрдЯ) рдХреЛ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХреЛ (рдХреНрд▓реИрдореНрдк (рдбреЙрдЯрдкреНрд░реЛрдб, -1.рдПрдл, 1. рдПрдл)) рд╕реЗ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖

рдпрджрд┐ рдЖрдк рдХреЛрдб, рдпрд╛ рдирд┐рдореНрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рджреЗрдЦрддреЗ рд╣реИрдВ: рдЕрд╕рд┐рди, рдПрдХреЛ, sqrt, fmod, рд▓реЙрдЧ, log10, рдЯреИрди, рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рдХрд▓рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдбреЛрдореЗрди рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рднреАрддрд░ рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдПрдХ рджрд┐рди рд╡рд╣ рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЪрд▓рд╛ рдЬрд╛рдПрдЧрд╛ред

Source: https://habr.com/ru/post/In116300/


All Articles