Как сравнивать double в c

Double.CompareTo Method in C# with Examples

Double.CompareTo Method is used to compare the current instance to a specified object or Double object. It will return an integer which shows whether the value of the current instance is greater than, less than or equal to the value of the specified object or Double object. There are 2 methods in the overload list of this method as follows:

Double.CompareTo(Double) Method

Double.CompareTo() Method is used to compare the current instance to a specified double-precision floating-point number and returns an integer which shows whether the value of this instance is less than, equal to, or greater than the value of the specified double-precision floating-point number.

Syntax:

Here, it takes a double-precision floating-point number to compare.

Return Value: This method returns a signed number indicating the relative values of this instance and value.

Сравнение double

Добрый день.
Простите за столь нубский вопрос, но как сравнить два значения double.
double min, double max получаются в результате вычислений. Как убедиться что min действительно меньше max?

Т.к. double может иметь погрешности, можно ли округлить значения до определенного знака после запятой, а потом сравнить?

Сравнение double
Есть задача сравнить два числа double. Допустим есть два числа 3.1 и 1.7, все что между ними — это.

Сравнение нескольких Double
Как правильно и кратко оформить такой метод? private Boolean IsParallelToMainPlanes(Double.

Сравнение разности двух double с нулем
Каким образом лучше сравнить разность двух чисел double с 0 ?

Сравнение массива типа string с числом типа double
Добрый день! Проблема заключается в том,что нужно найти индекс максимального размера галактики.

Быстрое сравнение double

Вчера здесь вышла статья о быстром парсинге double, я зашёл во блог к её автору, и нашёл там ещё один интересный трюк. При сравнении чисел с плавающей точкой особое внимание приходится уделять NaN (восемь лет назад я писал про них подробнее); но если сравниваемые числа заведомо не NaN, то сравнить их можно быстрее, чем это делает процессор!

Положительные double сравнивать очень просто: нормализация гарантирует нам, что из чисел с разной экспонентой больше то, чья экспонента больше, а из чисел с равной экспонентой больше то, чья мантисса больше. Стандарт IEEE 754 заботливо поместил экспоненту в старшие биты, так что положительные double можно сравнивать просто как int64_t.

С отрицательными числами немного сложнее: они хранятся в прямом коде, тогда как int64_t — в дополнительном. Это значит, что для использования целочисленного сравнения младшие 63 бита double необходимо инвертировать (при этом получится -0. < +0., что не соответствует стандарту, но на практике не представляет проблемы). Явная проверка старшего бита и условный переход уничтожили бы всю выгоду от перехода к целочисленному сравнению; но есть способ проще!

a>>63 заполняет все 64 бита копиями знакового бита, и затем >>1 обнуляет старший бит.

Во блоге у Daniel Lemire несколько другой код (той же вычислительной сложности), но мой вариант сохраняет то полезное свойство, что to_int64(0.) == 0

Сравнение значений типа double в C #

В чем причина этого? Вы можете предложить решение этой проблемы?

задан 09 сен ’09, 07:09

stack_pointer is EXTINCT

Не могли бы вы добавить свое заявление о двойнике, пожалуйста? — Lars Corneliussen

17 ответы

Это стандартная проблема из-за того, как компьютер хранит значения с плавающей запятой. Поищите здесь «проблему с плавающей запятой», и вы найдете массу информации.

Вкратце — поплавок / двойник не может хранить 0.1 точно. Всегда будет немного не по себе.

Вы можете попробовать использовать decimal тип, хранящий числа в десятичной системе счисления. Таким образом 0.1 будет представимо точно.

Вы хотели узнать причину:

Float / double хранятся как двоичные дроби, а не как десятичные дроби. Проиллюстрировать:

12.34 в десятичной системе счисления (что мы используем) означает

Компьютер хранит числа с плавающей запятой таким же образом, за исключением того, что он использует основание 2 : 10.01 означает

Теперь вы, вероятно, знаете, что есть некоторые числа, которые не могут быть полностью представлены в нашей десятичной системе счисления. Например, 1/3 в десятичной системе счисления 0.3333333… . То же самое происходит в двоичной системе счисления, за исключением того, что числа, которые невозможно представить точно, различны. Среди них число 1/10 . В двоичной системе счисления это 0.000110011001100… .

Поскольку двоичная система записи не может точно хранить ее, она хранится с округлением. Отсюда и ваша проблема.

ответ дан 15 мар ’18, в 17:03

Я полностью понимаю, о чем вы говорите выше. НО, зачем, если он написал x = 0.01; назначить x а затем по сравнению с буквальным 0.01 , не будет ли фактическое базовое двоичное значение x и 0.01 быть таким же (опять же, при условии, что никакие вычисления не использовались для присвоения x ). Следовательно, (x == 0.01) должно работать, не так ли? Как только вы выполните некоторые арифметические действия с x , однако все ставки сняты. Кроме того, я бы сказал более откровенно: if (x == 0.01d) прямо заявить, что 0.01 является двойным (и не конвертирующим 0.01 из float в double ) — что могло быть проблемой. — четыреполночь

@fourpastmidnight: я не могу воспроизвести то, что вы говорите (.NET 4). я получил true если я сравню 0.01 с 0.01 . — Тим Шмелтер

Да, если вы это сделаете x = 0.01; if ( x == 0.01) тогда сравнение должно быть верным. Что ж, при условии, что нет никаких неявных преобразований типа данных с плавающей точкой в ​​двойную (хотя, возможно, даже тогда). Но ОП не уточняет, как он получил первый 0.01 . Вполне вероятно, что это действительно результат расчетов. — Вилкс-

@Vilx — Правда, ОП не указывает, как x значение было присвоено. Если значение присваивается в ходе итерационных вычислений (то есть конечный результат составляет

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *