flotante x si la declaración se compara con el "valor cero"

Escriba una declaración if que compare la coma flotante x con el "valor cero"

Escriba una declaración if que compare float x con "valor cero": 
const float EPSINON = 0.00001;  
if ((x> = -EPSINON) && (x <= EPSINON) No  
use "==" o "!" Para variables de punto flotante = "En comparación con los números, debe intentar convertirlo en"> = "o" <= ". 

EPSINON debe ser un valor muy pequeño. Debido a que la computadora tiene un error al procesar números de coma flotante, juzgue los dos flotantes Si los puntos son los mismos, es necesario juzgar si caen en el mismo intervalo, este intervalo es [-EPSINON, EPSINON] EPSINON es generalmente muy pequeño, por debajo de 10 a -6 de potencia, lo específico parece ser incierto, y la máquina

[Conclusión] La
comparación equivalente de números de coma flotante usa la siguiente fórmula:
#include 
#include 
fabs (a-b) <FLT_EPSILON

three EPSILON:
FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON


¿ Por qué no se pueden usar directamente los números de coma flotante para la "comparación equivalente"?
He sabido esto antes de leer libros o artículos. Sé que se debe a la "precisión", pero nunca he pensado realmente en la gravedad del problema.

El siguiente contenido se cita de la "Guía para escribir código C / C ++ de alta calidad" de Lin Rui

4.3.3 ¿Comparar variables de coma flotante con valores cero
? [Regla 4-3-3] No compare las variables de coma flotante con "==" o "! =" Con ningún número.
Cabe señalar que no importa si es una variable de tipo flotante o doble, hay un límite de precisión. Por lo tanto, debemos evitar comparar las variables de punto flotante con "==" o "! =" A los números, y debemos tratar de convertirlos en forma "> =" o "<=".
Suponiendo que el nombre de la variable de punto flotante es x,
si (x == 0.0) // la comparación de error implícita se debe 
convertir a 
if ((x> = -EPSINON) && (x <= EPSINON))
donde EPSINON es el error permitido (Es decir, precisión).




Es mejor definir una constante simbólica para hacerlo. #definir EPSINON 1e-6


Creo que se debe a que los números de coma flotante tienen un rango amplio. Si un número ya es muy pequeño, puede considerarse como 0, epsinon, límite, límite o algo así.
También piense en ello, ¿es 0.9 bucle infinito igual a 1?
Si un cierto valor es igual a 0.9 ciclos, el número de coma flotante solo puede dar un valor "determinado", "hará lo incorrecto".

Creo que el principio es sobre esto. Específicamente, aún no lo he descubierto :)

Después de buscar nuevamente, escriba el siguiente párrafo:


Bueno, finalmente encontré una respuesta incompleta. De todos modos, nunca volveré a comparar los números de coma flotante directamente:
vea la publicación: http://blog.joycode.com/joe/archive/2004/12/07/40592.aspx

Escribí este ejemplo con referencia a este artículo:
#include <stdio.h>
#include <stdlib.h>

main ()
{
    float d1, d2, d3, d4;

    d1 = 194268.02;
    d2 = 194268;
    d4 = 0.02;
    
    d3 = d1 - d2;
    if (d3> d4)
       printf ("> 0.02 / n");
    más si (d3 <d4)
       printf ("<0.02 / n");
    sino
       printf ("= 0.02 / n");    

    printf ("% f -% f =% f / n", d1, d2, d3);

    system ("pausa");
}

Por favor vea el resultado:
<0.02
194268.015625-194268.000000 = 0.015625

, es decir: 194268.02-194268.0 no es igual a 0.02. ¡
El número almacenado en él cambiará! Tienes miedo Cambie las

cuatro variables a doble tipo y luego pruebe:
este es el resultado
<0.02
194268.020000-194268.000000 = 0.020000 es
claramente 0.02, ¿por qué es menor que?
¿No cambié el número que guardé esta vez? POR QUÉ

¡Dije que tengo miedo y no me atrevo a usar números de coma flotante para comparar la igualdad directamente!

Sigue siendo la misma oración: los números de coma flotante tienen una precisión limitada.
Entonces, el número que guarda no es necesariamente el número que desea.

Aunque este asunto es muy deprimente, todavía estoy muy feliz de saber algo.


Sobre EPSINON, no se puede definir de manera casual.
Y debería poder pensar que el EPSINON de doble y flotante son diferentes.
¿Qué se define como? No es necesario que lo defina. ANSI C ha definido estas constantes: puede consultar las constantes FLT_EPSILON DBL_EPSILON LDBL_EPSILON
cargando el archivo de encabezado
#include  .






 

115 artículos originales publicados · Me gusta 29 · Visitantes 50,000+

Supongo que te gusta

Origin blog.csdn.net/huabiaochen/article/details/100113665
Recomendado
Clasificación