Подскажите, как включить подсказки при вводе названия модуля (чтобы программа в выпадающем окне предлагала закончить его название)? После переустановки паскаля такая функция пропала
Её и небыло, анализатор кода никогда не показывал возможно подходящие файлы в папке.
Он может подсказывать имя пространства имён, как System
, если использовать Ctrl+Space (или включить подсказку по нажатию, или как её там).
И модули, которые уже подключены, добавляют одноимённое пространство имён в контекст, поэтому можно написать:
## uses GraphWPF;
gr
Поставить в конце курсор и нажав Ctrl+Space увидеть в списке GraphWPF
.
Посоветуйте хороший учебник если такой существует. Пожалуйста.
Спасибо.
var
b:set of integer;
e:set of 1..15;
begin
b:=[];
b:=b+[3]+[2.5];
writeln(b);
e:=[];
e:=e+[5]+[2.5]+[17];
writeln(e);
end.
Прокомментируйте, пожалуйста. Почему дробные числа попадают в множество?
Да, такого не должно конечно быть
А когда исправят?
Надо Issue написать
Я не умею…
Root(-8, 3)
это не NaN
, это -2
. Получается,
function Root(x, n: real): real;
begin
Result := x ** (1 / n);
if real.IsNaN(Result) and (Frac(n) = 0) and (Frac(n / 2) <> 0) then
Result := Sign(x) * Abs(x) ** (1 / n);
end;
правильнее, чем
. Этого всё равно не хватает: Root(-8, 1.5)
это не NaN
, это 4
: Root(-8, 1.5) = (-8)^(2/3) = Root((-8)^2, 3) = Root(64, 3) = 4. Тут всплывает давний вопрос:
Получается,
uses NumLibABC;
// Источник: http://forum.mmcs.sfedu.ru/t/pomoshh-novichkam/263/2724
/// Корень степени n из x без учёта дробных степеней из отрицательных чисел.
function Root(x, n: real): real;
begin
Result := x ** (1 / n);
if real.IsNaN(Result) and (Frac(n) = 0) and (Frac(n / 2) <> 0) then
Result := Sign(x) * Abs(x) ** (1 / n);
end;
/// Корень степени n из x.
function Root(x: real; n: Fraction) := Root(x ** real(n.denominator), real(n.numerator));
begin
Write(Root(-8, Frc(3, 2))); //4
end.
(с дробью) правильнее всего и по-другому никак?
Правильно, это и работает:
## (-8 ** (1/3)).Print;
И не забывайте, чтоб корень это обратная операция степени.
Нет никакого x
, так чтоб x**2=-4
, поэтому -4 ** (1/2)
и должно давать NaN
.
А даёт -2:
Тут работает приоритет операций, а не это. А через подпрограмму дробные степени из отрицательных чисел дают NaN
. Возможно ли избежать это без использования NumLibABC.Fraction?
Да, операция ** - по факту вызов функции и приоритет выше, чем для унарного минуса. Это указано в Справке. Поэтому -4 ** х эквивалентно -(4 ** х) и никогда там NaN не будет. Хотите NaN - пишите (-4) ** x
Друзья. Мы когда обучаем детей четырёх арифметических операций, обучаем их приоритеты, т.е. умножение и деление первым, сложение и вычитание вторым (если нет скобки). Затем в средних классах (6-7), когда обучим им операцию возведения в степень, мы часто забываем о том, что надо подсказать учащимся, что операция возведения в степень имеет большой приоритет и выполняется первым по отношению первых четырёх операций. Вот это надо учитывать и при обучение программированию!
Вот только понятию унарного минуса и его приоритету внимание при этом не уделяется.
Предисловие к первому вопросу
Точнее, от 2^1023 до 2^1024 (∞) погрешность real достигает 2^970, поскольку погрешность — половина расстояния между числами, а расстояние = 2^971. Вообще, расстояние между числами в [2^n;2^(n+1)] = 2^(n-52), где n ∈ Z, n ∈ [-1022;1023]. Понятно, что расстояние между 2^(-1075) (0) и 2^(-1074) (real.Epsilon) = последнему.
(Вопрос.)
Кстати, тогда число = мантисса / 2^1074, где мантисса ∈ Z, мантисса ∈ [2^0;2^52].
-
Правильно ли, что для n ∈ [-1074;-1023] расстояние между числами = (2^(n+1)-2^n)/(1+2^(n+1074))?
-
Есть ли стандартные подпрограммы для получения мантиссы и порядка типа real, то есть обратные нижеприведённым?
Вопрос неправильно поставлен - вместо NumLibABC.Fraction
всегда можно сделать свой тип.
Другое дело - возведение отрицательного числа в не_целую степень без расписывания степени в виде дроби из 2 целых.
Представление числа в real
всегда хранит значение в формате, который можно представить в виде ±a / (2**b)
где a
и b
- целые. a
связано с содержимым мантисы, а b
- с длиной мантисы и экспонентой.
Тем временем чтоб из отрицательного числа можно было взять корень - знаменатель степени (то есть степень корня) должна быть нечётным.
То есть даже если степень записали как 1/3
- после потери точности из за природы real
- знаменатель окажется чётным.
Так что да, в случае real
- отрицатльное число в не_целой степени в принципе не имеет смысла считать. Надо смотреть на конкретные случаи, когда нужна такая операция - и думать что делать в этих случаях отдельно.
Есть побитовые операции, которые можно применить к real
если прочитать его как целое.
Пример где я уже доставал отдельно мантису и экспоненту из real
можете посмотреть тут:
Кстати, NaN
не поэтому, а чтобы не было противоречия в математике. Если a < 0, k — нечётное, то a^(k/n) = a^((kp)/(np)), только если p — нечётное. Иначе получится |a|, а a<>|a|.
Обобщить никак? В файле лучшее обобщение, кроме оптимизации? Желательно обобщить, учитывая следующие пункты:
- Чтобы все возможные степени вычислялись без исключений, например, “
x**(знаменатель n) не помещается в real
” (см. Корень дробной степени из отрицательного числа.pas (5.8 КБ)). Может, для этого скопировать кодSystem.Math.Pow
и убрать оттуда, что
? Но для этого бы понять, куда ведёт https://github.com/SSCLI/sscli20_20060311/blob/707ae167cb556e76297df525369a5bdb0c6abee7/clr/src/classlibnative/float/comfloat.cpp#L275 .
- Без лишних
NaN
, например,
- При произвольной степени невозможно
?
- Максимально точно, чтобы не было случаев, когда
Может, для этого использовать подпрограмму корня типа, отличного от real? Есть ли такие вообще?