4

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

BigNum x = 0.1; 

Многие языки предоставляют или иметь доступ к библиотекам, которые позволят строительство таких объектов BigNum типа из текстовой строки. Я ищу языки программирования, которые могут преобразовывать числовой токен, например 0.1, непосредственно в BigNum, не требуя от программиста создания строки, которая затем должна быть проанализирована и потенциально может вызвать исключение или пометить ошибку во время выполнения. Вместо этого меня интересуют языки, на которых компилятор или токенизатор может сообщать синтаксические ошибки из некорректно отформатированных чисел или недопустимых выражений перед обработкой числового литерала в произвольное представление десятичного или целочисленного отношения точности.

С Literals/Floating point на веб-сайте Rosetta Code, это выглядит как J, Maple и Maxima обеспечивают буквальный синтаксис для чисел с плавающей точкой произвольной точности. Используют ли какие-либо другие более широко используемые языки то же самое или что-то похожее на приведенный выше псевдо-пример I?

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

x = 1//10 

Теперь 1//10 и 0.1 один и то же число математически - в базе 10. Тем не менее, большинство языков программирования будут преобразовывать буквальное десятичное число в исходном коде в ряд IEEE с плавающей точкой. Часто это именно то, что нужно. Однако более чем несколько человек, незнакомых с представлениями чисел с плавающей запятой IEEE, или аналогичные представления с плавающей запятой, которые в значительной степени исчезли в истории, удивлены, узнав, что одна десятая не является точно одной десятой, когда она преобразуется в двоичную фракцию. Более того, этот сюрприз обычно возникает после того, как код, который работает «большую часть времени», вызывает неожиданный результат, когда «ошибки» с плавающей запятой накапливаются довольно средними/сбрасываются. Конечно, это характер представлений с плавающей запятой и арифметических операций, которые, на самом деле, очень полезны на практике. Caveat emptor: What Every Computer Scientist Should Know About Floating-Point Arithmetic

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

До сих пор Джулия является хорошим ответом для рациональных чисел, но далека от единственного языка с поддержкой рациональных числовых литералов. Тем не менее, у него нет произвольных литералов точности. Для этого у J, Maple и Maxima есть то, что я ищу. Возможно, это почти полный список. Тем не менее, если кто-нибудь знает другого кандидата или два, я был бы признателен указатель ...

Ответ So Far ...

Лучший ответ на сегодняшний день является Haskell.Он обеспечивает богатое понимание numeric types и операций, а также числовую литераловую нотацию, которая включает в себя рациональные выражения чисел и которая, как представляется, предусматривает обработку десятичных чисел дробной частью как рациональных чисел, а не литералов с плавающей запятой во всех случаях. По крайней мере, это то, что я собираю от быстрого чтения Haskell документации и блоге я наткнулся, Overloading Haskell numbers, part 3, Fixed Precision, в котором автор заявляет:

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

Для многих программистов Julia будет более доступной, предлагая отличную поддержку для различных математических типов и операций, а также, как правило, отличную производительность. Однако Python имеет очень способный синтаксис, а также, многие изначально скомпилированные пакеты, которые соответствуют или превосходят те, которые доступны Джулии сегодня, и, безусловно, пользуется гораздо большее принятие и применение в коммерческих, с открытым исходным кодом, а также научные проекты - до сих пор, мой личное предпочтение для Джулии, если у меня есть выбор.

Для себя, я буду тратить больше времени reseaching Haskell и пересматривают OcamlF# /, которые могут быть жизнеспособные промежуточные варианты между Джулией/Python, как языки и язык, как Haskell - как эти языки программирования могут нарваться на какой-то спектр остается в качестве упражнения для читателя. Если Ocaml/F # предлагает сравнительную выразительную силу Haskell в тех случаях, когда у меня есть интерес, они могут быть лучшим выбором только на основе текущих и вероятных будущих коэффициентов принятия. Но на данный момент, Haskell, кажется, лучший ответ на мой оригинальный вопрос.

+0

Почему это для вас важно? – Marcin

+0

Большая часть программного обеспечения, которое я пишу, включает в себя математические вычисления, почти целиком состоящие из основных арифметических операций. Каждый номер, который вводит пользователь моего программного обеспечения, и каждый литерал либо в моем коде, либо используется в модульном тесте, представляет собой число, которое является либо целым числом, либо отношением конечных чисел (т. Е. Рациональным числом).Однако очень простые номера, предоставляемые пользователями, не могут быть точно представлены как число с плавающей точкой IEEE, даже если это может потребоваться для данного ввода. Например, пользователи должны ввести набор дробных чисел, сумма которых равна 1,0 для данной модели (например, .8, .1, .1). – Ned

+1

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

ответ

1

У Haskell есть Rationals, подкрепленные произвольной точностью Целые числа, и он имеет перегруженные числовые литералы, так что чаще всего ваши литералы имеют именно тот тип, который вы хотите.

+0

Из доступных в настоящее время языков программирования, Haskell most напрямую предоставляет то, о чем я просил. Это также наиболее широко используется и написано о любых изменениях, которые я исследовал или рекомендовал - хотя даже популярность Haskell очень ограничена по сравнению с наиболее широко используемыми языками. В отличие от таких языков, как Джулия, ее синтаксис и семантика более сложны для программистов, которые еще не хорошо разбираются в математических обозначениях и концепциях. В любом случае, это тот ответ, который я искал. Спасибо. – Ned

1

В Smalltalk VisualWorks расширен синтаксис ST-80 для того, чтобы ввести 1.23s, который является экземпляром FixedPoint (не то, что доброе имя ...), внутренне представлена ​​в виде рациональной дроби 123/100

Номер ведет себя точно так же, как Фракция, которая может иметь произвольный длинный числитель и знаменатель и выполняет точную арифметику, за исключением того, что у нее есть определенные правила печати: она округляется до фиксированного числа десятичных после разделителя десятичной дроби. 1.23s4 раундов до 4 десятичных знаков -> '1.2300' 1.23s раундов к предоставленному количеству цифр цифр, таким образом 2.

После Visualworks большинство диалектов Smalltalk добавили некоторые эквивалентные классы и одинаковый синтаксис. В Squeak класс называется ScaledDecimal, но в компиляторе реализован только синтаксис 1.23s2. Pharo также будет включать 1,23 в релизе 3.0.

+0

Очень интересно. Спасибо за информацию. – Ned

0

В схеме есть два типа чисел, точные и неточные, отличительные черты которых являются ортогональными к числовым типам (целым, рациональным, реальным, сложным). Операции с неточными числами дают неточные результаты, а неточные числа обычно реализуются как поплавки IEEE. Для удобства числовой литерал с десятичной точкой или экспонентой считается неточным, а один без предположения является точным, поэтому 1 и 1/10 и 1 + 2i являются точными, тогда как 1,0 и 0,1 и 1,0 + 2,0i являются неточный. Но вы можете переопределить это, указав букву с #e, чтобы сделать ее точным, или #i, чтобы сделать ее неточной, поэтому # e3.0 совпадает с 3, # e0.1 совпадает с 1/10, а # i1/10 совпадает с 0,1.

 Смежные вопросы

  • Нет связанных вопросов^_^