Почему Visual Studio 2008 говорит мне.9-.8999999999999995 = 0.00000000000000055511151231257827?

Вы могли возможно использовать запрос LINQ, чтобы сделать это:

int[] s = { 1, 2, 3, 3, 4};
int[] q = s.Distinct().ToArray();
8
задан Henk Holterman 19 October 2012 в 17:28
поделиться

6 ответов

Там всего 15-16 цифр в ответе. Все эти ведущие нули не в счет. Число на самом деле больше похоже на 5,5511151231257827 × 10 -16 . Порция мантиссы состоит из 15-16 цифр. Показатель (-16) служит для сдвига десятичной точки на 16 разрядов, но не меняет количество цифр в общем числе.

Править

После получения некоторых комментариев мне интересно узнать, что действительно происходит. Я вставил этот номер в этот конвертер IEEE-754 . Он позволил себе округлить последние «27» до «30», но я не думаю, что это изменит результаты.

Конвертер разбивает число на три двоичные части:

Знак: 0 (положительный )
Показатель степени: -51
Significand: 1.0100000000000000000000000000000000000000000000000000 (двоичный для 1.25 10 )

Таким образом, это число 1.01 2 × 2 -51 , или 1,25 10 × 2 -51 . Поскольку хранятся только три значащие двоичные цифры, это говорит о том, что Ларс может что-то зацепить. Они не могут быть «случайным шумом», поскольку они одинаковы каждый раз при преобразовании числа.

Данные предполагают, что единственная сохраненная цифра - «5». Начальные нули происходят от экспоненты, а остальные, казалось бы, случайные цифры - от вычисления 2 -51 .

41
ответ дан 5 December 2019 в 04:28
поделиться

Прочтите: Что должен делать каждый компьютерный ученый Знайте об арифметике с плавающей точкой .

В основном все сводится к хранению чисел с плавающей запятой с конечной точностью. Вы должны провести сравнение с некоторой дельтой.

if(.9 - .8999999999999995 <= 0.0001)
  //close enough to be equal
17
ответ дан 5 December 2019 в 04:28
поделиться

Начальные нули не имеют значения / часть точности (что касается числа с плавающей запятой - математически говоря, они равны существенный). Начальные нули связаны с показательной частью внутреннего представления числа с плавающей запятой.

Часть 55511151231257827 (которая является мантиссой или мантиссой ) имеет 17 десятичных цифр, что достаточно близко к 15-16 цифрам.

@Lars D: То, что вы считаете правильным, является правильным только в контексте вопроса. .9 - .8999999999999995 работает до числа с плавающей запятой со значением 0,625 и показателем -50. Если взять 0,625 * 2 -50 , получим 5,5511151231257827e-16. Сейчас, вне контекста исходного вопроса, у нас есть число с 17 значащими цифрами, которое действительно является нашим лучшим двоичным приближением 0,0000000000000005. Однако эти ведущие нули все еще не важны для представления числа с плавающей запятой.

14
ответ дан 5 December 2019 в 04:28
поделиться

«Плавающая» часть «с плавающей запятой» означает, что вы приближаетесь к 5.5511151231257827 * 10 ^ (- 16). Это не совсем то, как это представлено, потому что, конечно, все это делается в двоичном формате под капотом, но суть в том, что число представлено значащими цифрами плюс число, которое представляет, как далеко нужно переместить основание системы счисления (десятичную точку). Как всегда, википедия может дать вам более подробную информацию:

(вторая ссылка более конкретно сосредоточено на вашем конкретном случае.)

3
ответ дан 5 December 2019 в 04:28
поделиться

Я думаю, это потому, что в двоичной системе число 5 является периодическим, поскольку оно не делится на 2. И тогда применимо то, что сказал Марк Рушаков.

0
ответ дан 5 December 2019 в 04:28
поделиться

? .9 - .8999999999999995

Этот процесс вычитания с 15-16 значащими цифрами дает

0.0000000000000005

Остальные цифры представляют собой просто ошибки округления. Однако, поскольку компьютер всегда сохраняет 15-16 значащих цифр после первой ненулевой цифры, отображаются ошибки округления, и вы получаете множество конечных случайных цифр, образованных ошибками округления. Таким образом, результат состоит из 16 значащих цифр от операции вычитания плюс 16 цифр из памяти результата, что дает 32 цифры.

4
ответ дан 5 December 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: