Comments 22
Ну не люблю я заголовочные файлы. Часто они привносят в программу очень много лишнего.
Поэтому давайте натащим всё это лишнее прямо в компилятор?
У меня по соседству сидят девчёнки и пишут софт для решения структур белков. И им константа Больцмана нужна почти так же часто, как π. Надо встроить ?k?
На прошлом месте человек делал точный калькулятор масс для пептидов. Ему в компилятор тащить все константы из таблицы менделеева?
"То бензин, а то - дети" (с) х/ф "Джентельмены удачи"
Констант много, а такая одна)) Если нужна таблица Менделеева, то заголовочный файл - к месту. А ради одной константы создавать его не хочется. Кроме этого, в FPU есть аппаратная команда загрузки ПИ, а команды загрузки Больцмана нет )). Компилятор должен стараться использовать аппаратные возможности. По такой логике надо было бы добавить в компилятор еще и 4 аппаратные константы логарифмов, но лень - не используем мы их.
Вообще, если Пи где-то не определено, часто используют 4e0*atan(1e0).
Что касается команды аппаратной загрузки Пи, то она, честно говоря, малоприменима, так как очень редко требуется значение Пи само по себе, а обычно оно входит в более сложные константные выражения, которые целесообразно целиком вычислять на этапе копиляции.
acos(-1.) уже не в моде, нафига atan(1.) с коэффициентами тащить?
Я думаю, изначально это пошло оттого, что 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 окажутся в области видимости.
К сожалению, да, есть такая проблема. Я тоже красивого решения не вижу. Разве, что разрешить в языке греческий алфавит.
Но и он тоже не спасет ((
Главная проблема с math.h в C заключается в том, что тамошние константы имеют тип double. Использование вычислений большей точности всё порушит. Эта проблема не имеет удовлетворительного решения в рамках такой концепции.
Совершенно верно. Поэтому фундаментальные математические константы должны быть нетипизированными и представлять соответствующие числа (Пи, Е и т.д.) как математические абстракции, а не как литералы конкретного типа. А это можно сделать только путем введения ключевых слов языка (возможно контекстных, видимых лишь в каком-то пространстве имен, не важно).
То есть, допустим, есть у нас "длинная арифметика" типа GMP - ОК, константа Pi и там будет константой той длины, которая используется в данный момент. Хоть килобайтной длины:)
Причем эту концепцию можно распространить и на все остальные литералы. Допустим, число 42: что это - int32, int64, uint8, float, double? Может вообще какой нибудь экзотический fixed point формат? Это должен решать компилятор с помощью автовывода типа. У литерала нет специальных суффиксов типа, но в большинстве существующих языков тип все равно прибит к литералу.
Аналогично, строковый литерал может быть однобайтовым (в одной из множества кодировок), utf8, utf16. utf32 и т.д. Конкретный тип пусть выводит компилятор.
Если мы хотим сделать литерал конкретного типа - используем явные суффиксы, конструкторы или приведение типов. В большинстве же случаев тип можно извлечь из контекста и опций компиляции.
На это можно посмотреть и под немного другим углом – в обсуждаемом в статье языке PL/I число 42 имеет вполне определённый тип decimail fixed (2, 0), то есть целое из двух десятичных цифр.
В большинстве же случаев тип можно извлечь из контекста и опций компиляции.
Да. Но это противоречит модному в наши дни веянию сильной типизации.
from math import pi, e
Просто вспоминается, что встроенная PI была ещё в Бейсике. Неожиданно узнать, что сейчас не во всех языках она есть по умолчанию.
Тот, кто хочет «Пи» запомнить,
Должен часто повторять:
Три, четырнадцать, пятнадцать,
Девяносто два, шесть, пять..
У нас такая "мудрость" была. На 1 знак больше )
Причем, чем глупее стишок, тем лучше запоминается. Со школы помню рад металлов, замещающих водород в кислотах. Только из-за стихотворного размера.
Натрий, калий, кальций, магний
Алюминий, цинк, железо,
Никель, олово, свинец.
Почти пирожок получился ))
Это я знаю и помню прекрасно:
Пи многие знаки мне лишни, напрасны
(ещё 3 знака)
Усложнение на ровном месте.
В C++ (boost constants) и Rust тупо есть файлы с кучей различных констант типов float/double. Поскольку они являются константами времени компиляции, компилятор обращения к ним прекрасно встраивает и даже во время компиляции выводит выражения с ними (вроде два Пи).
А в бекенд компилятора под конкретно x87 FPU (хотя кто его нынче использует?) можно добавить оптимизацию, которая бы обращение к Пи заменяла на соответствующую инструкцию.
Немного про «ПИ» и другие встроенные константы