Этот вопрос задает языки программирования, которые принимают числовые константы для назначения произвольным прецизионным переменным или для использования в произвольных выражениях точности без преобразования в представление с плавающей точкой 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, кажется, лучший ответ на мой оригинальный вопрос.
Почему это для вас важно? – Marcin
Большая часть программного обеспечения, которое я пишу, включает в себя математические вычисления, почти целиком состоящие из основных арифметических операций. Каждый номер, который вводит пользователь моего программного обеспечения, и каждый литерал либо в моем коде, либо используется в модульном тесте, представляет собой число, которое является либо целым числом, либо отношением конечных чисел (т. Е. Рациональным числом).Однако очень простые номера, предоставляемые пользователями, не могут быть точно представлены как число с плавающей точкой IEEE, даже если это может потребоваться для данного ввода. Например, пользователи должны ввести набор дробных чисел, сумма которых равна 1,0 для данной модели (например, .8, .1, .1). – Ned
Поскольку речь идет о работе с пользователями, вам действительно не нужен язык, который обрабатывает это с помощью литерала. Вам все равно нужно разбирать ваш вход, чтобы вы могли использовать его для управления библиотекой на любом языке. Сосредоточьтесь на других, чтобы выбрать язык (включая простоту создания необходимых парсеров). – Marcin