2010-09-03 17 views
7

Imagine que a - b < c (a, b, c son dobles de C#). ¿Está garantizado que a < b + c?C# Problema de precisión doble

Gracias!

EDITAR
Digamos que el desbordamiento aritmético no se produce a diferencia del ejemplo siguiente:

double a = 1L << 53; 
double b = 1; 
double c = a; 

Console.WriteLine(a - b < c); // Prints True 
Console.WriteLine(a < b + c); // Prints False 

Imagínese que Math.Abs ​​(a) < 1.0 & & Math.Abs ​​(b) < 1,0 & & Math.Abs ​​(c) < 1,0

+0

¿Cómo se relaciona esto con C# o una y tipo de datos específicos (o incluso programación)? Parece pura matemática para mí. –

+2

@Fredrik Mörk: No, todo se trata de precisión. – jgauffin

+1

@Fredrik Mörk: Porque tiene que ver con el nivel de precisión de los idiomas en la aritmética no entera – BeRecursive

Respuesta

14

No. Supongamos que a = c, un número muy grande, y b es un número muy pequeño. Es posible que a - b tenga una representación inferior a a, pero a + b está tan cerca de a (y más grande) que todavía termina siendo representada más precisamente como a.

He aquí un ejemplo:

double a = 1L << 53; 
double b = 1; 
double c = a; 

Console.WriteLine(a - b < c); // Prints True 
Console.WriteLine(a < b + c); // Prints False 

EDIT:

Aquí hay otro ejemplo, que coincide con su pregunta Editado:

double a = 1.0; 
double b = 1.0/(1L << 53); 
double c = a; 

Console.WriteLine(a - b < c); // Prints True 
Console.WriteLine(a < b + c); // Prints False 

En otras palabras, cuando se resta un número muy pequeño de 1, obtenemos un resultado menor que 1. Cuando agregamos el mismo número a 1, obtenemos 1 de vuelta debido a las limitaciones de la precisión doble.

+0

+1, prueba por un ejemplo de contador. Quiéralo. –

+0

o al revés, también tengo la sensación de que es así. –

+2

Se vuelve aún más extraño cuando 'a = c = double.MaxValue'. Entonces ambos son falsos. –

6

hay no siempre:

 double a = double.MaxValue; 
     double b = double.MaxValue; 
     double c = 0.1; 
     Console.WriteLine(a - b < c); // True 
     Console.WriteLine(a < b + c); // False 
2

Este enlace habla acerca de las propiedades aritméticas de punto flotante, y podría ser muy interesante:

FLOATING-POINT FALLACIES

En particular, la búsqueda de Propiedades de Relaciones

Cuestiones relacionadas