Почему C представляет некоторые плавающие точки, но не другие с одинаковым количеством десятичных знаков [дубликат]

Чтобы иметь доступ к ним из ваших статических методов, они должны быть статическими переменными-членами, например:

public class MyProgram7 {
  static Scanner scan = new Scanner(System.in);
  static int compareCount = 0;
  static int low = 0;
  static int high = 0;
  static int mid = 0;  
  static int key = 0;  
  static Scanner temp;  
  static int[]list;  
  static String menu, outputString;  
  static int option = 1;  
  static boolean found = false;

  public static void main (String[]args) throws IOException {
  ...
258
задан Barry Brown 6 July 2009 в 21:55
поделиться

20 ответов

Десятичные числа могут быть представлены точно, если у вас достаточно места - просто не с помощью плавающих двоичных номеров точек. Если вы используете плавающий тип десятичный тип (например, System.Decimal в .NET), то множество значений, которые не могут быть представлены точно в двоичной плавающей запятой, могут быть точно представлены.

Давайте посмотрим на это по-другому - в базе 10, с которой вам, вероятно, будет комфортно, вы не можете точно выразить 1/3. Это 0.3333333 ... (повторяющийся). Причина, по которой вы не можете представить 0,1 в качестве двоичного числа с плавающей запятой, по той же причине. Вы можете точно представлять 3, 9 и 27, но не 1/3, 1/9 или 1/27.

Проблема в том, что 3 - простое число, которое не является фактором 10 . Это не проблема, когда вы хотите умножить число на 3: вы всегда можете умножить на целое число, не сталкиваясь с проблемами. Но когда вы разделите на число, которое является простым и не является фактором вашей базы, вы можете столкнуться с проблемой (и будет делать это, если вы попытаетесь разделить 1 по этому числу).

Хотя 0,1 обычно используется в качестве простейшего примера точного десятичного числа, которое не может быть представлено точно в двоичной плавающей точке, возможно, 0.2 является более простым примером, так как это 1/5 - и 5 - простое число, которое вызывает проблемы между десятичными и двоичными.


Боковое примечание для решения проблемы конечных представлений:

Некоторые типы плавающих десятичных точек имеют фиксированный размер например System.Decimal, другие, такие как java.math.BigDecimal, «сколь угодно велики», но в какой-то момент они достигнут предела, будь то системная память или теоретический максимальный размер массива. Однако это совершенно отдельный момент для основного ответа. Даже если у вас было действительно произвольно большое количество бит, с которыми вы играли, вы все равно не могли бы представлять десятичные числа 0,1 точно в виде плавающего двоичного представления. Сравните это с другим способом: заданное произвольное число десятичных цифр, вы можете точно представлять любое число, которое точно представляется как плавающая двоичная точка.

334
ответ дан Jon Skeet 26 August 2018 в 11:46
поделиться
  • 1
    Это прекрасный пример, сэр! – Tom Ritter 6 July 2009 в 21:23
  • 2
    Человечество привинчивается, имея всего 2 пальца. – Jon Skeet 6 July 2009 в 21:26
  • 3
    Да, есть 10 видов людей в мире - тех, кто понимает двоичные и тех, кто этого не делает. – duffymo 6 July 2009 в 21:26
  • 4
    @JonSkeet: Ctrl + Alt + Delete будет выглядеть неловко всего двумя пальцами. – Lars Haugseth 6 July 2009 в 22:39
  • 5
    @muusbolla: Нет. Числа, представленные десятичным представлением 1 и десятичным представлением 0.9... (бесконечно повторяющиеся 9 s после десятичной точки), равны. Возможно, самый простой способ увидеть это: Пусть x = 0.9.... Обратите внимание, что 10x = 9.9..... Поэтому 9x = 10x - x = 9.9... - 0.9... = 9 так, что 9x = 9 и x = 1. Есть и другие способы увидеть это, но я считаю, что это самое простое. – jason 4 November 2009 в 17:36

Например, число 61.0 имеет точное двоичное представление, потому что интегральная часть любого числа всегда точна. Но число 6.10 не является точным. Все, что я сделал, это перемещение десятичного места, и я внезапно перешел из Exactopia в Inexactville. Математически не должно быть внутренней разницы между двумя числами - они просто цифры.

Давайте немного отстранимся от деталей баз 10 и 2. Давайте спросим base b, какие числа имеют завершающие представления, а какие нет? Мгновенная мысль говорит нам, что число x имеет завершающее b -представление тогда и только тогда, когда существует целое число n такое, что x b^n является целым числом.

Итак, например , x = 11/500 имеет завершающее 10-представление, потому что мы можем выбрать n = 3, а затем x b^n = 22, целое число. Однако x = 1/3 этого не делает, потому что независимо от того, что n мы выбрали, мы не сможем избавиться от 3.

. Этот второй пример подсказывает нам думать о факторах, и мы можем видеть, что для любого рациональный x = p/q (предполагается, что он имеет наименьшие члены), мы можем ответить на вопрос, сравнив простые факторизации b и q. Если q имеет какие-либо простые множители не в простой факторизации b, мы никогда не сможем найти подходящий n, чтобы избавиться от этих факторов.

Таким образом, для базы 10 any p/q, где q имеет простые множители, отличные от 2 или 5, не будет иметь конечного представления.

Итак, теперь, возвращаясь к основаниям 10 и 2, мы видим, что любой рациональное с завершающим 10-представлением будет иметь вид p/q точно, когда q имеет только 2 s и 5 s в своей простой факторизации; и то же число будет иметь завершающее 2-представление, когда q имеет только 2 s в своей простой факторизации.

Но один из этих случаев является подмножеством другого! Всякий раз, когда

q имеет только 2 s в своей простой факторизации

, очевидно, также верно, что

q имеет только 2 s и 5 s в своей простой факторизации

или, по-другому, когда p/q имеет завершающий 2-представление, p/q имеет завершающее 10-представление. Однако обратное, однако, имеет место не - всякий раз, когда q имеет 5 в своей простой факторизации, он будет иметь завершающее 10-представление, но не является завершающим 2-представлением. Это пример 0.1, упомянутый другими ответами.

Итак, у нас есть ответ на ваш вопрос - потому что простые множители 2 являются подмножеством простых множителей 10, все 2-оканчивающиеся числа являются 10-конечными числами, но не наоборот. Это не примерно 61 против 6.1 - это около 10 против 2.

Как заключительная заметка, если какой-то причудой люди использовали (скажем) базу 17, но наши компьютеры использовали базу 5, ваша интуиция никогда бы не была приведена в действие в этом случае - no (ненулевые, нецелые) числа, которые прекратились в обоих случаях!

20
ответ дан AakashM 26 August 2018 в 11:46
поделиться
  • 1
    Итак, почему «alert» (0,15 * 0,15) » дисплей "0,0225"? – Michael Geiser 3 November 2014 в 21:00
  • 2
    @MichaelGeiser короткий ответ: округление в точке отображения. То, что вы думаете, 0.15 на самом деле (при сохранении как двойной IEEE) `0.149999999999999999444448884876874`. См. jsfiddle . – AakashM 3 November 2014 в 23:29
  • 3
    Приятно понять пример кода точки! Хотел бы я дать вам за это право! Мне нужно сыграть с несколькими функциями, чтобы исследовать, где происходит обрезание раунда. Я все еще просто поражен тем, что нам действительно нужно иметь дело с этим мусором; так как люди работают в базе десять почти в 100% случаев, и мы используем нецелые числа столько времени, что вы думаете, что реализация математики с плавающей запятой по умолчанию будет обрабатывать эту бессмыслицу. – Michael Geiser 4 November 2014 в 17:13
  • 4
    @MichaelGeiser схемы для работы с базой 2 меньше, быстрее и эффективнее, чем те, которые работают с базой 10. Сегодня мы можем оправдать накладные расходы, но в 1970-х годах, когда устанавливались стандарты, это было большое дело. Попытка сделать это без прямой поддержки схем процессора еще хуже, ожидайте, что порядок разностей в скорости. – Mark Ransom 27 January 2016 в 23:59
  • 5
    Этот ответ объясняет лучше, чем сам Джон Скит! – goelakash 13 March 2016 в 22:53

BCD - Двоично-кодированные десятичные - представления точны. Они не очень эффективны с точки зрения пространства, но это компромисс, который вы должны сделать для точности в этом случае.

5
ответ дан Alan 26 August 2018 в 11:46
поделиться
  • 1
    BCD не более или менее точны, чем любая другая база. Пример: как вы представляете 1/3 точно в BCD? Вы не можете. – Jörg W Mittag 7 July 2009 в 10:23
  • 2
    BCD является точным представлением DECIMAL, таким образом, um, "decimal" часть его названия. Точного десятичного представления 1/3 нет. – Alan 11 July 2009 в 16:07

(Примечание: я добавлю «b», чтобы указать здесь двоичные числа. Все остальные числа указаны в десятичной форме)

. Один из способов думать о вещах - это нечто вроде научной нотации. Мы привыкли видеть числа, выраженные в научной нотации, например, 6.022141 * 10 ^ 23. Числа с плавающей запятой хранятся внутри с использованием аналогичного формата - мантиссы и экспоненты, но с использованием полномочий два вместо десяти.

Ваш 61.0 можно переписать как 1.90625 * 2 ^ 5, или 1.11101b * 2 ^ 101b с мантиссой и экспонентами. Чтобы умножить это на десять и (переместить десятичную точку), мы можем сделать:

(1.90625 * 2 ^ 5) * (1.25 * 2 ^ 3) = (2.3828125 * 2 ^ 8) = (1.19140625) * 2 ^ 9)

или in с мантиссой и показателями в двоичном виде:

(1.11101b * 2 ^ 101b) * (1.01b * 2 ^ 11b) = (10.0110001b * 2 ^ 1000b) = (1.00110001b * 2 ^ 1001b)

Обратите внимание на то, что мы там сделали, чтобы умножить числа. Мы умножили мантиссы и добавили экспоненты. Затем, поскольку мантисса закончилась больше двух, мы нормализовали результат, нажимая экспонента. Это точно также, когда мы корректируем экспоненту после выполнения операции над числами в десятичной научной нотации. В каждом случае значения, с которыми мы работали, имели конечное представление в двоичном выражении, поэтому значения, выводимые основными операциями умножения и сложения, также приводили к значениям с конечным представлением.

Теперь рассмотрим, d разделите 61 на 10. Мы начнем с деления мантис, 1.90625 и 1.25. В десятичной форме это дает 1.525, хороший короткий номер. Но что это такое, если мы преобразуем его в двоичный? Мы сделаем это обычным способом - вычитаем наибольшую мощность из двух, когда это возможно, так же, как преобразование целочисленных десятичных знаков в двоичные, но мы будем использовать отрицательные силы двух:

1.525         - 1*2^0   --> 1
0.525         - 1*2^-1  --> 1
0.025         - 0*2^-2  --> 0
0.025         - 0*2^-3  --> 0
0.025         - 0*2^-4  --> 0
0.025         - 0*2^-5  --> 0
0.025         - 1*2^-6  --> 1
0.009375      - 1*2^-7  --> 1
0.0015625     - 0*2^-8  --> 0
0.0015625     - 0*2^-9  --> 0
0.0015625     - 1*2^-10 --> 1
0.0005859375  - 1*2^-11 --> 1
0.00009765625...

Uh oh , Теперь у нас проблемы. Оказывается, что 1.90625 / 1.25 = 1.525, представляет собой повторяющуюся фракцию, выраженную в двоичном выражении: 1.11101b / 1.01b = 1.10000110011 ... b Наши машины имеют только так много бит, чтобы удерживать эту мантиссу, и поэтому они будут округлять фракцию и принять нули за пределами определенной точки. Ошибка, которую вы видите при разделении 61 на 10, представляет собой разницу между:

1.100001100110011001100110011001100110011 ... b * 2 ^ 10b и, скажем, 1.100001100110011001100110b * 2 ^ 10b

Это округление мантиссы, что приводит к потере точности, которую мы связываем со значениями с плавающей запятой. Даже когда мантисса может быть точно выражена (например, при простом добавлении двух чисел), мы все равно можем получить числовые потери, если мантиссе нужно слишком много цифр, чтобы соответствовать после нормализации экспоненты.

Мы действительно делаем этот вид все время, когда мы округливаем десятичные числа до управляемого размера и просто даем первые несколько цифр. Поскольку мы выражаем результат в десятичном значении, он чувствует себя естественным. Но если бы мы округлили десятичное число, а затем преобразовали его в другую базу, это выглядело бы столь же уродливым, как десятичные числа, которые мы получаем из-за округления с плавающей запятой.

4
ответ дан Boojum 26 August 2018 в 11:46
поделиться

Если вы сделаете достаточно большое число с плавающей запятой (так как это может сделать экспоненты), вы также получите неточность перед десятичной точкой. Поэтому я не думаю, что ваш вопрос полностью оправдан, потому что предпосылка неверна; это не тот случай, когда смещение на 10 всегда будет создавать большую точность, потому что в какой-то момент число с плавающей запятой должно будет использовать экспоненты, чтобы представить масштабность числа, и также потеряет некоторую точность.

4
ответ дан Daniel Lew 26 August 2018 в 11:46
поделиться

Проблема в том, что вы действительно не знаете, действительно ли число действительно равно 61.0. Рассмотрим это:


float a = 60;
float b = 0.1;
float c = a + b * 10;

Каково значение c? Это не точно 61, потому что b не действительно .1, потому что .1 не имеет точного двоичного представления.

1
ответ дан Dima 26 August 2018 в 11:46
поделиться

По той же причине вы не можете точно представлять 1/3 в базе 10, вам нужно сказать 0.33333 (3). В двоичном виде это тот же тип проблемы, но просто встречается для разных наборов чисел.

4
ответ дан James 26 August 2018 в 11:46
поделиться

Причиной неточности является характер числовых баз. В базе 10 вы не можете точно представлять 1/3. Это становится 0.333 ... Однако в основании 3 1/3 точно представлено 0,1, а 1/2 - бесконечно повторяющееся десятичное (тризимальное?). Значения, которые могут быть окончательно представлены, зависят от числа уникальных простых факторов основания, поэтому основание 30 [2 * 3 * 5] может представлять больше фракций, чем основание 2 или основание 10. Еще больше для основания 210 [2 * 3 * 5 * 7].

Это отдельная проблема из «ошибки с плавающей запятой». Неточность заключается в том, что несколько миллиардов значений распространяются в гораздо большем диапазоне. Поэтому, если у вас есть 23 бит для значения, вы можете представить только около 8,3 миллионов различных значений. Затем 8-разрядный показатель предоставляет 256 опций для распределения этих значений. Эта схема позволяет получить наиболее точные десятичные числа вблизи 0, поэтому вы можете почти представить 0,1.

30
ответ дан James M. 26 August 2018 в 11:46
поделиться
  • 1
    Это вовсе не связано с представлением с плавающей запятой. База, которую вы выбираете для вашей плавающей точки, определяет, какие числа могут быть точно представлены. Да, числа с плавающей запятой с фиксированным размером всегда будут иметь пределы их точности - но это база, которая останавливает многие числа decimal , которые точно представлены в двоичной с плавающей запятой, а не в размере , Возьмите столько бит, сколько хотите - вы все равно не сможете точно представлять десятичный 0,1 в двоичном формате. – Jon Skeet 6 July 2009 в 21:33
  • 2
    Правильно, я обновил его, чтобы надеяться, уточнить, что второй абзац относится к ошибкам, вызванным отдельной проблемой. – James M. 6 July 2009 в 21:42
  • 3
    Справа - да, это намного лучше :) – Jon Skeet 6 July 2009 в 21:48

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

Плавающие и целочисленные представления предоставляют сетки или решетки для представленных чисел. По мере выполнения арифметики результаты выпадают из сетки и должны быть возвращены в сетку округлением. Пример: 1/10 в бинарной сетке.

Если мы будем использовать двоичное кодированное десятичное представление, как предложил один джентльмен, могли бы мы сохранить числа в сетке?

0
ответ дан Joe 26 August 2018 в 11:46
поделиться
  • 1
    Десятичные числа, конечно. Но это по определению. Вы не можете представлять 1/3 в десятичной форме, больше, чем вы можете представлять 0,1 в двоичном формате. Любая схема квантования терпит неудачу для бесконечно большого набора чисел. – Kylotan 18 February 2011 в 21:45

Число 61.0 действительно имеет точную операцию с плавающей запятой, но это не так для всех целых чисел. Если вы написали цикл, который добавил его как к числу с плавающей запятой с двойной точностью, так и к 64-битовому целому числу, в конечном итоге вы достигнете точки, где 64-битное целое отлично представляет число, но плавающая точка не делает- потому что не хватает значительных бит.

Намного проще достичь точки аппроксимации в правой части десятичной точки. Если вы начали записывать все числа в двоичной с плавающей запятой, это имело бы смысл.

Еще один способ задуматься о том, что, когда вы отмечаете, что 61.0 отлично представимо в базе 10 и смещает десятичная точка вокруг не меняет этого, вы выполняете умножение на степени десяти (10 ^ 1, 10 ^ -1). В плавающей точке умножение на две степени не влияет на точность числа. Попробуйте взять 61.0 и делить его на три раза для иллюстрации того, как точное число может потерять точное представление.

0
ответ дан John Calsbeek 26 August 2018 в 11:46
поделиться

Существует порог, потому что значение цифры переместилось от целого к нецелому. Чтобы представить 61, вы имеете 6 * 10 ^ 1 + 1 * 10 ^ 0; 10 ^ 1 и 10 ^ 0 - целые числа. 6.1 - 6 * 10 ^ 0 + 1 * 10 ^ -1, но 10 ^ -1 - 1/10, что определенно не является целым числом. Вот как вы оказались в Inexactville.

1
ответ дан Mark Ransom 26 August 2018 в 11:46
поделиться

Параллель может быть сделана из дробей и целых чисел. Некоторые фракции, например, 1/7, не могут быть представлены в десятичной форме без большого количества десятичных знаков. Поскольку переменная с плавающей запятой основана на бинарном значении, изменяются особые случаи, но возникают те же проблемы с точностью.

1
ответ дан mP. 26 August 2018 в 11:46
поделиться

Я удивлен, что никто этого не сказал: используйте продолженные дроби . Любое рациональное число может быть представлено конечно в двоичном виде.

Некоторые примеры:

1/3 (0.3333 ...)

0; 3

5 / 9 (0,5555 ...)

0; 1, 1, 4

10/43 (0,232558139534883720930 ...)

0; 4, 3, 3

9093/18478 (0.49209871198181621387596060179673 ...)

0; 2, 31, 7, 8, 5

Здесь существует множество известных способов хранения последовательности целых чисел в памяти.

В дополнение к сохранению вашего номера с полной точностью, продолжающиеся дроби также имеют некоторые другие преимущества, такие как наилучшая рациональная аппроксимация. Если вы решите закончить последовательность чисел в продолженной доле раньше, оставшиеся цифры (когда рекомбинируются до фракции) дадут вам наилучшую возможную долю. Таким образом, найдены приближения к pi:

Продолжающаяся дроби Pi:

3; 7, 15, 1, 292 ...

Завершая последовательность в 1, это дает долю:

355 / 113

, который является отличным рациональным приближением.

3
ответ дан Nick 26 August 2018 в 11:46
поделиться
  • 1
    Но как вы представляете это в двоичном формате? Например, 15 требует представления 4 бит, но 292 требует 9. Как аппаратное обеспечение (или даже программное обеспечение) знает, где границы бит между ними? Это компромисс между эффективностью и точностью. – ardent 5 July 2013 в 20:26

Повторить то, что я сказал в своем комментарии к мистеру Скиту: мы можем представлять 1/3, 1/9, 1/27 или любое рациональное в десятичной нотации. Мы делаем это, добавляя дополнительный символ. Например, строка над цифрами, которые повторяются в десятичном расширении числа. Мы должны представлять десятичные числа в виде последовательности двоичных чисел: 1) последовательность двоичных чисел, 2) точка счисления и 3) некоторый другой символ для обозначения повторяющейся части последовательности.

Обозначение цитаты Хехнера - это способ сделать это. Он использует символ цитаты для представления повторяющейся части последовательности. Статья: http://www.cs.toronto.edu/~hehner/ratno.pdf и запись в Википедии: http://en.wikipedia.org/wiki/Quote_notation .

Нет ничего, что говорит о том, что мы не можем добавить символ в нашу систему представления, поэтому мы можем представлять десятичные рациональные выражения с использованием двоичной нотации цитат и наоборот.

8
ответ дан ntownsend 26 August 2018 в 11:46
поделиться
  • 1
    Эта система обозначений работает, если мы знаем, где цикл начинается и заканчивается. Люди довольно хорошо разбираются в циклах. Но, в общем, компьютеров нет. Чтобы использовать возможность эффективно использовать символ повторения, компьютер должен был бы определить, где циклы после вычисления. Например, для номера 1/3 цикл начинается сразу. Но для номера 1/97 цикл не отображается, пока вы не выработали ответ по меньшей мере на 96 цифр. (На самом деле вам понадобится 96 * 2 + 1 = 193 цифры.) – Barry Brown 25 September 2009 в 18:04
  • 2
    На самом деле для компьютера совсем не сложно обнаружить цикл. Если вы прочитаете статью Хехнера, он описывает, как определить циклы для различных арифметических операций. Например, в алгоритме деления, который использует повторное вычитание, вы знаете, где цикл начинается, когда вы видите разницу, которую вы видели раньше. – ntownsend 28 September 2009 в 15:08
  • 3
    Кроме того, вопрос состоял в том, чтобы точно представлять числа. Иногда точное представление означает много бит. Красота нотации цитат заключается в том, что Хехнер демонстрирует, что в среднем есть 31% -ное сокращение размера представления по сравнению со стандартным 32-битным представлением фиксированной длины. – ntownsend 28 September 2009 в 15:14

Высокий скоринговый ответ выше прибил его.

Сначала вы смешали базу 2 и базу 10 в своем вопросе, а затем, когда вы поместили номер справа, который не делится на базу, вы получаете проблемы. Как 1/3 в десятичном, потому что 3 не входит в мощность 10 или 1/5 в двоичном коде, которая не переходит в силу 2.

Еще один комментарий, хотя НИКОГДА не используйте равные числа с плавающей запятой, период. Даже если это точное представление, в некоторых системах с плавающей запятой есть некоторые числа, которые могут быть точно представлены более чем одним способом (IEEE плохо об этом, это ужасная спецификация с плавающей запятой, так что ожидайте головные боли). Здесь нет ничего, что 1/3 не равно EQUAL числу на вашем калькуляторе 0.3333333, независимо от того, сколько из них 3 находится справа от десятичной точки. Это или может быть достаточно близко, но не равно. поэтому вы ожидаете, что что-то вроде 2 * 1/3 не будет равно 2/3 в зависимости от округления. Никогда не используйте равную с плавающей точкой.

0
ответ дан old_timer 26 August 2018 в 11:46
поделиться

В уравнении

2^x = y ;  
x = log(y) / log(2)

Следовательно, мне просто интересно, можем ли мы иметь логарифмическую базовую систему для двоичного типа,

 2^1, 2^0, 2^(log(1/2) / log(2)), 2^(log(1/4) / log(2)), 2^(log(1/8) / log(2)),2^(log(1/16) / log(2)) ........

. Это может решить проблема, поэтому, если вы хотите записать что-то вроде 32.41 в двоичном формате, это будет

2^5 + 2^(log(0.4) / log(2)) + 2^(log(0.01) / log(2))

Или

2^5 + 2^(log(0.41) / log(2))
2
ответ дан rachit_verma 26 August 2018 в 11:46
поделиться

Это хороший вопрос.

Весь ваш вопрос основан на «как мы представляем число?»

ВСЕ числа могут быть представлены десятичным представлением или с двоичным (Дополнение 2-го). Все они !!

НО некоторые (большинство из них) требуют бесконечного количества элементов («0» или «1» для двоичной позиции или «0», «1» - «9» для десятичное представление).

Как 1/3 в десятичном представлении (1/3 = 0,33333333 ... & lt; - с бесконечным числом «3»)

Как 0,1 в двоичный (0,1 = 0,00011001100110011 .... & lt; - с бесконечным числом «0011»)

Все в этой концепции. Поскольку ваш компьютер может рассматривать только конечный набор цифр (десятичный или двоичный), только некоторые цифры могут быть точно представлены на вашем компьютере ...

И, как сказал Джон, 3 - простое число, которое не является в 10 раз, поэтому 1/3 не может быть представлено конечным числом элементов в основании 10.

Даже с арифметикой с произвольной точностью система нумерации в базе 2 не может полностью описать 6.1 , хотя он может представлять 61.

Для 6.1 мы должны использовать другое представление (например, десятичное представление или IEEE 854, которое допускает базу 2 или base 10 для представления значений с плавающей запятой)

4
ответ дан ThibThib 26 August 2018 в 11:46
поделиться
  • 1
    Вы можете представлять 1/3 в качестве самой фракции. Вам не нужно бесконечное количество бит для его представления. Вы просто представляете его как долю 1/3 вместо результата принятия 1 и деления его на 3. Несколько систем работают именно так. Затем вам нужно использовать стандартные / * + - и подобные операторы для работы над представлением фракций, но это довольно просто - вы можете делать эти операции с помощью ручки и бумаги, обучая компьютер, чтобы сделать это, не имеет большого значения , – nos 10 July 2009 в 21:55
  • 2
    Я говорил о «двоичном (2-ом дополнении) представлении». Поскольку, конечно, использование другого представления может помочь вам представить число some с конечным числом элементов (и вам понадобится бесконечное количество элементов для некоторых других) – ThibThib 11 August 2009 в 18:18

Корневая (математическая) причина состоит в том, что когда вы имеете дело с целыми числами, они бесконечно бесконечны.

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

Однако действительные числа несчетно бесконечны. Вы не можете сказать «дайте мне реальное число в позиции 610000000000000» и верните ответ. Причина в том, что даже между 0 и 1 существует бесконечное число значений, когда вы рассматриваете значения с плавающей запятой. То же самое справедливо для любых двух чисел с плавающей запятой.

Дополнительная информация:

http://en.wikipedia.org/wiki/Countable_set

http://en.wikipedia.org/wiki/Uncountable_set

Обновление: Мои извинения, я, кажется, неправильно истолковал вопрос. Мой ответ о том, почему мы не можем представлять каждое значение real , я не понял, что с плавающей запятой автоматически классифицируется как рациональный.

15
ответ дан TM. 26 August 2018 в 11:46
поделиться
  • 1
    Действительно, рациональные числа являются счетно бесконечными. Но не каждое число real является рациональным числом. Я могу, конечно, создать последовательность точных десятичных чисел, которая достигнет любого точного десятичного числа, которое вы хотите мне дать в конечном итоге. Это если вам нужно иметь дело с иррациональными номерами, а также, что вы попадаете в бесчисленные бесконечные множества. – Jon Skeet 6 July 2009 в 21:25
  • 2
    Правда, я должен сказать «реальный», а не «с плавающей запятой». Прояснит. – TM. 6 July 2009 в 21:27
  • 3
    В этот момент логика становится менее применимой, ИМО - потому что мы не можем не только обрабатывать все числа real , используя двоичную с плавающей запятой, но мы даже не можем иметь дело со всеми рациональными числа (например, 0,1). Другими словами, я не думаю, что это действительно связано с счетностью вообще :) – Jon Skeet 6 July 2009 в 21:31
  • 4
    Числа с плавающей запятой, по определению, рациональны. – molf 6 July 2009 в 21:40
  • 5
    @TM: Но ОП не пытается представить все реальные числа. Он пытается представить все точные числа десятичных , которые являются подмножеством чисел рациональных и, следовательно, только счетно бесконечны. Если бы он использовал бесконечный набор бит как десятичный тип с плавающей запятой , тогда он был бы в порядке. Он использует эти биты как тип с плавающей запятой двоичный , что вызывает проблемы с десятичными числами. – Jon Skeet 6 July 2009 в 21:41

вы знаете целые числа? каждый бит представляет 2 ^ n

2 ^ 4 = 16 2 ^ 3 = 8 2 ^ 2 = 4 2 ^ 1 = 2 2 ^ 0 = 1

хорошо то же самое для (с некоторыми отличиями), но биты представляют 2 ^ -n 2 ^ -1 = 1/2 = 0,5 2 ^ -2 = 1 / (2 * 2) = 0,25 2 ^ -3 = 0,125 2 ^ -4 = 0.0625

Двоичное представление с плавающей запятой:

sign & nbsp; Exponent & nbsp; & nbsp; & nbsp; Фракция (я думаю, что невидимая 1 добавляется к фракции) B11 & nbsp; & nbsp; B10 B9 B8 & nbsp; ; & nbsp; & nbsp; B7 B6 B5 B4 B3 B2 B1 B0

0
ответ дан yan bellavance 26 August 2018 в 11:46
поделиться

Существует бесконечное число рациональных чисел и конечное число бит, с помощью которых их можно представить. См. http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems .

0
ответ дан zpasternack 26 August 2018 в 11:46
поделиться
  • 1
    Но даже с бесконечным количеством бит, если вы использовали плавающую двоичную точку, вы все равно не сможете точно представлять 0,1, точно так же, как вы не можете представлять 1/3 точно в десятичной четности с бесконечным количеством бит. – Jon Skeet 6 July 2009 в 21:48
  • 2
    @Jon Это неверно: с бесконечным числом десятичных знаков, I может , например, выразить «одну треть» точно . Реальная проблема заключается в том, что физически невозможно иметь «бесконечное число». десятичных знаков или бит. – ChrisW 6 July 2009 в 22:16
Другие вопросы по тегам:

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