Память и иррациональность и плавающие числа - PullRequest
2 голосов
/ 30 августа 2011

Некоторые числа не могут быть сохранены в «битах памяти», поскольку их двоичное представление сделает их бесконечными.

В двоичном коде 11.111011101110 ... это не точное число. Я не могу точно вспомнить, что это сейчас.

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

Некоторые рациональные числа сталкиваются с этой проблемой при преобразовании в базу 2. Так как же мы ...

1) представлять их?

2) рассчитать их с помощью компьютерных программ?

3) выполнять над ними операции?

Edit: Чтобы удалить путаницу и сказать спасибо:

Хорошо, я сказал в вышеприведенном посте -> чтобы посмотреть или подумать, что это иррациональное число или число, идущее долго и долго в десятичном месте. пожалуйста, прочитайте слово «как».

Теперь у меня есть число 0,2, это простое число не может быть представлено в двоичной форме. так как выполнять операции над ним.

Другие вопросы до сих пор не решены.

ну просто упомянуть за мою веру в людей здесь:

Хорошо, перейдите к «библиотеке», или примерно хранилище не является ответом для фанатов stackoverflow, поскольку они являются определенными приложениями, где важно иметь числа такими, какие они есть.

Ответы [ 7 ]

5 голосов
/ 30 августа 2011

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

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

1 голос
/ 31 августа 2011

Это не иррациональные числа, это периодические числа. 1/3 - периодическое число в десятичном виде. 1/10 - это периодическое число в двоичном формате. Оба рациональны (не зависят от базы). Фактически, является ли число рациональным или нет, оно не имеет ничего общего с базой.

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

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

 314159265358979/100000000000000

или

3141592653589793/1000000000000000
1 голос
/ 30 августа 2011

Все целые числа представлены точно.Вы говорите о дробных и иррациональных числах, верно?

Нерациональные числа не могут быть представлены двоичными числами, как десятичные.Таким образом, они могут быть представлены только с определенной точностью.Проблема с дробными числами состоит в том, что не каждое десятичное число может быть точно представлено как двоичное.например 0,9.Это связано с природой чисел с плавающей запятой.

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

Другое решение аналогично десятичным периодическим числам.Представьте их как два числа: дивиденд и делитель.поэтому десятичный периодический 0. (3) может быть представлен точно как 1 и 3.

0 голосов
/ 30 августа 2011

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

0 голосов
/ 30 августа 2011

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

Рациональные числа, которые не имеют конечных представлений базы 2, являются рациональными числами, которые не имеют степеней 2 в знаменателе, причем 2 является единственным основным фактором базы. Аналогично для других базисов вам нужно взглянуть на основные факторы базы, поэтому для базисных 10 произведение степеней 2 и степеней 5 имеет конечные представления.

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

0 голосов
/ 30 августа 2011

Нет общего пути. Например, номер:

sqrt(2) * sqrt(2)

можно найти с символьным или числовым подходом.

Относительно рациональных чисел: их можно представить как пару (больших) целых чисел и выполнять над ними арифметические операции.

0 голосов
/ 30 августа 2011

Мы не делаем.Мы используем их приблизительные значения.Существуют алгоритмы, которые могут вычислять их с любой необходимой точностью.

И, кстати, не каждое бесконечно длинное число является иррациональным.Например, число 1/3 бесконечно длинно в базе 10: 0.333333333 ... и в базе 2: 0.0101010101 ..., но оно рационально.

...