Perl 和次标准浮点零

问题描述 投票:0回答:1

在 Perl 中使用浮点格式,我注意到一些奇怪的地方: 看来 Perl 5.18.2(至少在 x86_64 Linux 上)无法正确处理次正规数(如

-0
)(给定 IEEE 64 位二进制表示形式“2**(-1023 - 52)”应该是一个不同于零的次正规数)。

main::(-e:1):   1
  DB<1> $x=2**-1076

  DB<2> x $x
0  0
  DB<3> x $x > 0
0  ''
  DB<4> printf('%g', $x)
0
  DB<5> printf('%e', $x)
0.000000e+00
  DB<6> $x=-2**-1076

  DB<7> x $x
0  0
  DB<8> x $x < 0
0  ''
  DB<9> printf('%g', $x)
-0
  DB<10> printf('%e', $x)
-0.000000e+00

Number

2**-1075
仍打印为零,但
2**-1074
打印为
4.94065645841247e-324

  DB<20> $x = -2**-1074

  DB<21> x $x < 0
0  1
  DB<22> $x = -2**-1075

  DB<23> x $x < 0
0  ''
  DB<24> printf('%g', $x)
-0

任何人都可以证实这一点,还是犯了一个思维错误?

perl floating-point ieee-754
1个回答
0
投票

Perl [...] 似乎不处理次正规数

Perl 可以完美地处理次正规数。

printf "%.1000g", 2**(-1074);

4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324

Perl 似乎不处理次正规数(如 -0)

零(正或负)不被视为次正常值。

Perl 确实支持 -0。

printf "%f\n", -0.0;

-0.000000

© www.soinside.com 2019 - 2024. All rights reserved.