2010-09-03 24 views
7

Bu düşüncenin a - b < c (a, b, c C# çiftleridir). a < b + c'un garantisi var mı?C# çift duyarlık sorunu

Teşekkürler!

DÜZENLEME
en aritmetik taşma aşağıdaki örnekte aksine oluşmaz diyelim:

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

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

düşünün o Math.abs (a) < 1.0 & & Math.abs (b) < 1.0 & & Math.abs (c) < 1,0

+0

Bu, C# veya bir y özel veri tipi (hatta programlama)? Bana saf matematik gibi görünüyor. –

+2

@Fredrik Mörk: Hayır, hepsi hassasiyetle ilgili. – jgauffin

+1

@Fredrik Mörk: Çünkü tamsayı olmayan aritmetik – BeRecursive

cevap

14

No A = c, çok büyük bir sayı ve b'nin çok küçük bir sayı olduğunu varsayalım. a - b'un a'dan daha küçük bir temsile sahip olması mümkündür, ancak, a'a (ve daha büyük), a olarak en kesin olarak gösterilebilecek kadar yakındır. İşte

bir örnek:

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

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

DÜZENLEME: Diğer bir deyişle

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 

, biz gelen çok az sayıda çıkarmak:

İşte Düzenlenen soru eşleşen bir başka örnek, var 1, 1'den küçük bir sonuç elde ederiz. Aynı sayıyı 1'e eklediğimizde, çift duyarlık sınırlamaları nedeniyle 1 tane geri alırız. hayır değil hep

+0

+1, bir karşı örnek tarafından kanıtlanması. Sevdim. –

+0

veya başka bir şekilde, bunun gibi hissediyorum. –

+2

a = c = double.MaxValue' olduğunda bile daha garipleşir. O zaman ikisi de yanlıştır. –

6

:

 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

Bu bağlantı kayan noktalı aritmetik özellikleri hakkında konuşuyor ve çok ilginç olabilir: İlişkiler Özellikleri için özellikle FLOATING-POINT FALLACIES

, arama