Почему значения Rust с плавающей запятой могут содержать большие значения с несколькими значащими цифрами, а целые числа - нет? - PullRequest
0 голосов
/ 29 марта 2019

Почему только значения с плавающей точкой в ​​Rust могут содержать большие значения с несколькими значащими цифрами, а целые не могут?

println!("{}", std::f64::MAX); // 1.7976931348623157e199
println!("{}", std::i64::MAX); // 9223372036854775807

Если у меня есть целое число, то есть 99e100есть какой-нибудь примитив в Rust, который может хранить это значение как целое число, или я вынужден использовать число с плавающей точкой?

1 Ответ

4 голосов
/ 29 марта 2019

Примитивы ржавчины имеют фиксированный размер.Таким образом, существует конечное число уникальных значений, которые они могут хранить, не более 2 ^ n, где n - количество битов в типе.В случае целочисленных типов эти битовые комбинации назначаются каждому последующему целому числу вплоть до количества значений, которые они могут представлять, начиная с 0. Кроме того, в случае целых чисел со знаком половина этих шаблонов присваивается отрицательным числам.

С учетом этих спецификаций максимальное значение, которое может хранить i64, составляет 2 ^ 63-1 (это число, которое вы напечатали).Наибольшее целое число со знаком i128 может содержать значение до 2 ^ 127-1.И если вы используете u128, вы можете получить до 2 ^ 128-1.Это самое большое значение, которое может содержать примитивный целочисленный тип в Rust, значительно меньше, чем ваш запрос для 99e100.

Если вы хотите большие целые числа, вам нужно использовать либо больший тип фиксированного размера, либо неограниченный тип, который растет по мере необходимости.Ни один из них не является частью стандарта Rust.Таким образом, вам придется либо написать свою собственную реализацию, либо использовать чужую, такую ​​как номер ящика .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...