C # проблема двойной точности - PullRequest
7 голосов
/ 03 сентября 2010

Представьте, что a - b (a, b, c - двойные C #).Гарантируется ли, что a ?

Спасибо!

EDIT
Допустим, что арифметическое переполнение не происходитв отличие от следующего примера:

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

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

Представьте, что Math.Abs ​​(a) <1.0 && Math.Abs ​​(b) <1.0 && Math.Abs ​​(c) <1.0 </strong>

Ответы [ 3 ]

14 голосов
/ 03 сентября 2010

Нет.Предположим, что a = c, очень большое число, а b очень маленькое число.Возможно, что a - b имеет представление меньше a, но a + b настолько близко к a (и больше), что все равно оказывается наиболее точным представлением в виде a.

Вот пример:

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

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

РЕДАКТИРОВАТЬ:

Вот еще один пример, который соответствует вашему отредактированному вопросу:

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

Другими словами, когда мы вычитаем очень маленькийчисло от 1, мы получаем результат меньше 1. Когда мы добавляем одно и то же число к 1, мы просто возвращаем 1 из-за ограничений двойной точности.

6 голосов
/ 03 сентября 2010

нет не всегда:

        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 голосов
/ 03 сентября 2010

Эта ссылка говорит об арифметических свойствах с плавающей запятой и может быть очень интересной:

FALLACIES с плавающей точкой

В частности,поиск Свойства отношений

...