Да я вот сначала тоже так подумал)) Хотел уж было писать, что операция + не перегружена для BigInteger. А вот нет, перегружена))0). Да и число маленькое, его можно уместить в int64.
Но с ОЧЕНЬ БОЛЬШИМИ числами это тоже работает, так что не вижу смысла дублировать операцию += в виде древнепаскальской процедуры.
begin
var b := new byte[32];
System.Security.Cryptography.RNGCryptoServiceProvider.Create.GetBytes(b);
var bi := new BigInteger(b);
bi.Println;
bi += 1;
bi.Println;
end.
В старых решениях Inc и Dec иногда фигурируют, для них обязательно нужна совместимость, потому эта фигня в языке и есть. Во всех остальных смыслах Inc и Dec бесполезны.
Кстати, у Inc и Dec очень уж интересная реализация)))
procedure Inc(var i: integer);
begin
i += 1;
end;
procedure Inc(var i: integer; n: integer);
begin
i += n;
end;
procedure Dec(var i: integer);
begin
i -= 1;
end;
procedure Dec(var i: integer; n: integer);
begin
i -= n;
end;
Я не считаю правильным открывать дискуссию о “полезных” и “бесполезных” конструкциях, уже присутствующих в языке. Это прерогатива разработчиков. Другое дело, когда обсуждается целесообразность вводить в язык что-то дополнительное - там дискуссия на мой взгляд может быть полезна.
Вас не понять. То конструкции бесполезны, то полезны “в некоторых смыслах”… Вы уж там определитесь и выскажите свою четкую позицию разработчикам. Только не тут, ибо оффтопик.
Все правы. Inc и Dec оставлены для совместимости. В новом коде надо использовать += и -=. Поскольку в старом коде BigInteger встретиться не может, то для него и нет Inc и Dec.
Мы как можем стимулируем переход на новый нормальный код.
Иначе либо слишком маленькое, либо слишком большое число соответственно.
Так можно и факториалы находить (выдержка из моего модуля):
function intfact(a:BigInteger):BigInteger;
begin
intfact:=1;
var i:biginteger:=2;
while i <= a do
begin
intfact*=i;
i+=1;
end;
end;
Здесь Ваша программа работает на еще большем числе. И
да, сейчас лучше и удобнее (на мой взгляд) пользоваться специальными операторами присвоения,
чем функциями инкремента и декремента в PascalABC.Net.
Но повторю о возникновении ошибки:
Следовательно, хотел бы узнать, как правильно сообщить об ошибке разработчикам.
И правильно, дальше переполнение произойдёт. Надо писать так:
begin
var i := BigInteger.Parse('18446744073709551616');
end.
Раз у вас не выдаёт ошибку как у меня на скрине - значит у вас устаревшая версия компилятора. Всегда проверяйте обновления перед тем как сообщать ошибку, а то вы путаницу создаёте.
Всё правильно, Ваше число за пределами uint64, у меня такая же ошибка.
Для моей функции работает
как Вы и цитировали.
PascalABCCompiler.Core v3.5.0.2167 (01.07.2019), debug version
Runtime version: 4.0.30319.42000
OS version: Microsoft Windows NT 6.1.7601 Service Pack 1
Processor count: 4
WorkingSet: 147716 kb
Но, это, если что, далеко не самый быстрый способ присвоить число… Если будете делать сохранение/загрузку каких то данных - лучше преобразовывайте BigInteger к массиву байт. А из строки - это только для тестирования/задания констант нормально.
Так это не вывод а ошибка. Ошибки тоже “выводятся”, но когда говорят “вывод” - обычно имеют в виду содержимое потока вывода (System.Diagnostics.Process.StandardOutput).
Я имел ввиду, что мой модуль с inc(a:biginteger) работает правильно, так как вывод верный.
А в системном модуле такой функции не было, значит и происходила ошибка.