Perl 浮点数有什么域?

What domain does the Perl floating point have?

谁能帮我解决这个问题,在 Perl 编程语言中找不到任何关于浮点域的信息?

对于 x86 或 x64 的 perl 版本,很少能找到与以下内容不同的内容:

  • 它们可以表示大至 ≈ ±1.7976931348623157 × 10308.
  • 它们可以表示小至 ≈ ±4.9406564584124654 × 10−324.
  • 的数字
  • 它们有 53 位(≈ 16 位)的精度。[1]
  • 它们可以无损地表示最大为 ±253 (±9,007,199,254,740,992) 的所有整数。

Perl 通常使用 C double,但我相信在构建 Perl 时可以更改。

在 x86 或 x64 上,doubleIEEE double-precision floating-point number[2],它提供 53 位精度(将近 16 位)。

信息由perl提供:

$ perl -V:nvtype
nvtype='double';

$ perl -V:nvsize
nvsize='8';

$ perl -V:nv_preserves_uv_bits
nv_preserves_uv_bits='53';

$ perl -V:nv_overflows_integers_at
nv_overflows_integers_at='256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0';

$ perl -Mv5.10 -MConfig -e'say eval $Config{nv_overflows_integers_at}'
9007199254740992

程序可以通过 the Config module 提供的 %Config 散列来使用这些变量。

nv_overflows_integers_at比不能用浮点数表示的最小整数小一。可以表示更大的整数(有些有精度损失,有些没有精度损失),但是可以表示不超过此数字的每个整数而不会损失精度(在正负端)。


  1. 最小的数字(“次正规数”)只有 52 位精度。
  2. C 编译器可以生成 double 其他内容,但这没有意义。