Pull to refresh

Comments 22

Ну не люблю я заголовочные файлы. Часто они привносят в программу очень много лишнего.

Поэтому давайте натащим всё это лишнее прямо в компилятор?

У меня по соседству сидят девчёнки и пишут софт для решения структур белков. И им константа Больцмана нужна почти так же часто, как π. Надо встроить ?k?

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

"То бензин, а то - дети" (с) х/ф "Джентельмены удачи"

Констант много, а такая одна)) Если нужна таблица Менделеева, то заголовочный файл - к месту. А ради одной константы создавать его не хочется. Кроме этого, в FPU есть аппаратная команда загрузки ПИ, а команды загрузки Больцмана нет )). Компилятор должен стараться использовать аппаратные возможности. По такой логике надо было бы добавить в компилятор еще и 4 аппаратные константы логарифмов, но лень - не используем мы их.

Джентльмены, камрад. Не джентельмены.

.

Согласен, но главный герой произносил именно так ))

Вообще, если Пи где-то не определено, часто используют 4e0*atan(1e0).

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

Я думаю, изначально это пошло оттого, что acos вычисляется через asin (кстати, в свою очередь с использованием значения Пи), a asin - через atan. Но фактически разницы для языка PL/I нет, вызов встроенной функции с константным аргументом и производное от него выражение вычисляется на этапе компиляции.

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

В С/С++ математические константы определены в math.h (что конечно не совсем хорошо, учитывая, что во многих процессорах есть встроенные константы). И даже если использовать math.h - еще есть некий костыль в виде _USE_MATH_DEFINES, который тоже нужно писать каждый раз.

Хорошо бы сделать их просто ключевыми словами языка. И если с Pi это еще прокатит, то вот число E... ну нехорошо делать одну букву ключевым словом. Чисто эстетически нехорошо.

Использовать префиксы как в С++ (M_PI, M_2PI, M_E)? Вариант, но выглядит кривовато, не слишком эстетично.

Использовать пространства имен (Math.Pi, Math.E)? Тоже вариант, но по идее в том же Math должны содержаться и всякие синусы с косинусами; и если в некотором файле открыть это пространство имен (не писать же каждый раз Math.sin(x) и Math.cos(x)), то опять же однобуквенные имена типа E окажутся в области видимости.

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

Но и он тоже не спасет ((

Разве, что разрешить в языке греческий алфавит.

Некоторые таким путём и пошли, Julia, например.

Hidden text

Да, конечно. Но наука наплодила много других значков типа "аш с планкой". Прямо хоть вводи в юникод отдельное семейство "знаки научных формул" ((

Зачем вводить, там уже 99% нужных символов уже есть.

Hidden text

Главная проблема с math.h в C заключается в том, что тамошние константы имеют тип double. Использование вычислений большей точности всё порушит. Эта проблема не имеет удовлетворительного решения в рамках такой концепции.

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

То есть, допустим, есть у нас "длинная арифметика" типа GMP - ОК, константа Pi и там будет константой той длины, которая используется в данный момент. Хоть килобайтной длины:)

Причем эту концепцию можно распространить и на все остальные литералы. Допустим, число 42: что это - int32, int64, uint8, float, double? Может вообще какой нибудь экзотический fixed point формат? Это должен решать компилятор с помощью автовывода типа. У литерала нет специальных суффиксов типа, но в большинстве существующих языков тип все равно прибит к литералу.

Аналогично, строковый литерал может быть однобайтовым (в одной из множества кодировок), utf8, utf16. utf32 и т.д. Конкретный тип пусть выводит компилятор.

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

На это можно посмотреть и под немного другим углом – в обсуждаемом в статье языке PL/I число 42 имеет вполне определённый тип decimail fixed (2, 0), то есть целое из двух десятичных цифр.

В большинстве же случаев тип можно извлечь из контекста и опций компиляции.

Да. Но это противоречит модному в наши дни веянию сильной типизации.

Да. Но это противоречит модному в наши дни веянию сильной типизации.

Зато не противоречит модному в наши дни веянию автоматического вывода типов :)

Просто вспоминается, что встроенная PI была ещё в Бейсике. Неожиданно узнать, что сейчас не во всех языках она есть по умолчанию.

Тот, кто хочет «Пи» запомнить,
Должен часто повторять:
Три, четырнадцать, пятнадцать,
Девяносто два, шесть, пять..

У нас такая "мудрость" была. На 1 знак больше )

Причем, чем глупее стишок, тем лучше запоминается. Со школы помню рад металлов, замещающих водород в кислотах. Только из-за стихотворного размера.

Натрий, калий, кальций, магний

Алюминий, цинк, железо,

Никель, олово, свинец.

Почти пирожок получился ))

Это я знаю и помню прекрасно:

Пи многие знаки мне лишни, напрасны

(ещё 3 знака)

Усложнение на ровном месте.
В C++ (boost constants) и Rust тупо есть файлы с кучей различных констант типов float/double. Поскольку они являются константами времени компиляции, компилятор обращения к ним прекрасно встраивает и даже во время компиляции выводит выражения с ними (вроде два Пи).
А в бекенд компилятора под конкретно x87 FPU (хотя кто его нынче использует?) можно добавить оптимизацию, которая бы обращение к Пи заменяла на соответствующую инструкцию.

Sign up to leave a comment.

Articles