Могут ли числа с плавающей запятой, заканчивающиеся на `.0`, рассматриваться как математические числа - PullRequest
0 голосов
/ 31 мая 2019

Мы все знаем, что использование чисел с плавающей запятой может привести к странным результатам:

>>> 0.1*3
0.30000000000000004

Мой вопрос: все ли числа с плавающей запятой, заканчивающиеся на .0, можно считать математическими целыми числами?

Мой вариант использования:

>>> x = 3.4296875
>>> 2*x*(128*x-695)+1856
100.0

Можно ли утверждать, что нет никакой причуды и что результат является истинным и точным 100?Я имею в виду, не делая вычисления вручную!

Спасибо!

Ответы [ 2 ]

1 голос
/ 31 мая 2019

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

Если дробная часть числа с плавающей запятой равна нулю, делает личисло представляет математическое целое число?

Да.Согласно стандарту IEEE-754 с плавающей точкой и, как правило, с другими форматами с плавающей точкой, объект с плавающей точкой представляет одно конкретное число (или бесконечность или NaN).Он не представляет интервал чисел.Таким образом, если объект с плавающей запятой не является NaN или бесконечностью, а его дробная часть равна нулю, то значение, которое он представляет, является целым числом.

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

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

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

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

Если число с плавающей точкой отображается с «.0», это целое число?

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

Если число с плавающей запятой является целым числом, может ли оно использоваться как целочисленный тип?

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

Является ли результат в коде целым числом?

В показанном кодев вопросе ошибок округления нет.Значение для x, 3.4296875, равно 439/128, и это можно безошибочно представить во всех распространенных форматах с плавающей запятой.Таким образом, умножение на 128 дает точный результат, 439. Вычитание 695 из этого дает -256, а умножение 2*x*-256 дает ровно -1756, а затем добавление 1856 дает ровно 100. Это целое число.Это может быть неверно в других случаях, когда используются нецелочисленные данные.

0 голосов
/ 31 мая 2019

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

>>> x = 1+1e-100
>>> x == 1
True
>>> isinstance(x,int)
False
>>> isinstance(x,float)
True

Работа Уильяма Кахана была достаточно педагогической, чтобы мы осознавали все опасности заманчивых коротких путей.

...