gpt4 book ai didi

perl - Perl 中的最大整数

转载 作者:行者123 更新时间:2023-12-02 05:26:49 25 4
gpt4 key购买 nike

套装$i=0并做 ++$i虽然它增加。我们会达到哪个数字?

请注意,它可能与 Perl 中的最大整数不同(如标题中所问),因为相邻整数之间可能存在大于 1 的间隙。 .

最佳答案

“整数”可以指一系列数据类型( int16_tuint32_t 等)。这些可以代表的数字没有差距。

“整数”也可以指没有小数部分的数字,无论用于存储它的变量的类型如何。 ++将在数据类型之间无缝转换,所以这与这个问题相关。

从这个意义上说,浮点数可以存储整数,并且可以将非常大的数字存储为浮点数,而不能向它们加一。这样做的原因是浮点数是使用以下形式存储的:

[+/-]1._____..._____ * 2**____

例如,假设您的浮点数的尾数可以存储小数点后的 52 位,并且您想添加 12**53 .
     __52 bits__
/ \
1.00000...00000 * 2**53 Large power of two
+ 1.00000...00000 * 2**0 1
--------------------------
1.00000...00000 * 2**53
+ 0.00000...000001 * 2**53 Normalized exponents
--------------------------
1.00000...00000 * 2**53
+ 0.00000...00000 * 2**53 What we really get due to limited number of bits
--------------------------
1.00000...00000 * 2**53 Original large power of two

因此,在使用浮点数时可能会出现缺口。但是,您从一个存储为有符号整数的数字开始。
$ perl -MB=svref_2object,SVf_IVisUV,SVf_NOK -e'
$i = 0;
$sv = svref_2object(\$i);
print $sv->FLAGS & SVf_NOK ? "NV\n" # Float
: $sv->FLAGS & SVf_IVisUV ? "UV\n" # Unsigned int
: "IV\n"; # Signed int
'
IV
++$i将数字保留为有符号整数值(“IV”),直到它不再存在。那时,它将开始使用无符号整数值(“UV”)。
$ perl -MConfig -MB=svref_2object,SVf_IVisUV,SVf_NOK -e'
$i = hex("7F".("FF"x($Config{ivsize}-2))."FD");
$sv = svref_2object(\$i);
for (1..4) {
++$i;
printf $sv->FLAGS & SVf_NOK ? "NV %.0f\n"
: $sv->FLAGS & SVf_IVisUV ? "UV %u\n"
: "IV %d\n", $i;
}
'
IV 2147483646
IV 2147483647 <-- 2**31 - 1 Largest IV
UV 2147483648
UV 2147483649

或者
IV 9223372036854775806
IV 9223372036854775807 <-- 2**63 - 1 Largest IV
UV 9223372036854775808
UV 9223372036854775809

仍然没有差距,因为还没有使用浮点数。但是 Perl 最终会使用浮点数(“NV”),因为它们的范围比整数大得多。 ++$i当无符号整数用完时,将切换到使用浮点数。

何时发生取决于您的 Perl 版本。并非所有 Perl 版本都具有相同的整数和浮点数大小。

在一台机器上:
$ perl -V:[in]vsize
ivsize='4'; # 32-bit integers
nvsize='8'; # 64-bit floats

另外一个:
$ perl -V:[in]vsize
ivsize='8'; # 64-bit integers
nvsize='8'; # 64-bit floats

在 nvsize 大于 ivsize 的系统上

在这些系统上,第一个间隙将发生在最大的无符号整数之上。如果您的系统使用 IEEE double 浮点数,则您的浮点数具有 53 位精度。它们可以无损地表示从 -253 到 253(含)的所有整数。 ++将无法增加。
$ perl -MConfig -MB=svref_2object,SVf_IVisUV,SVf_NOK -e'
$i = eval($Config{nv_overflows_integers_at}) - 3;
$sv = svref_2object(\$i);
for (1..4) {
++$i;
printf $sv->FLAGS & SVf_NOK ? "NV %.0f\n"
: $sv->FLAGS & SVf_IVisUV ? "UV %u\n"
: "IV %d\n", $i;
}
'
NV 9007199254740990
NV 9007199254740991
NV 9007199254740992 <-- 2**53 Requires 1 bit of precision as a float
NV 9007199254740992 <-- 2**53 + 1 Requires 54 bits of precision as a float
but only 53 are available.

在 nvsize 不大于 ivsize 的系统上

在这些系统上,第一个间隙将发生在最大的无符号整数之前。切换到浮点数将允许您更进一步(2 的大幂),但仅此而已。 ++将无法增加超过最大的无符号整数 + 1。
$ perl -MConfig -MB=svref_2object,SVf_IVisUV,SVf_NOK -e'
$i = hex(("FF"x($Config{ivsize}-1))."FD");
$sv = svref_2object(\$i);
for (1..4) {
++$i;
printf $sv->FLAGS & SVf_NOK ? "NV %.0f\n"
: $sv->FLAGS & SVf_IVisUV ? "UV %u\n"
: "IV %d\n", $i;
}
'
UV 18446744073709551614
UV 18446744073709551615 <-- 2**64 - 1 Largest UV
NV 18446744073709551616 <-- 2**64 Requires 1 bit of precision as a float
NV 18446744073709551616 <-- 2**64 + 1 Requires 65 bits of precision as a float
but only 53 are available.

关于perl - Perl 中的最大整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25081972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com