在 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 [...] 似乎不处理次正规数
Perl 可以完美地处理次正规数。
printf "%.1000g", 2**(-1074);
4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324
Perl 似乎不处理次正规数(如 -0)
零(正或负)不被视为次正常值。
Perl 确实支持 -0。
printf "%f\n", -0.0;
-0.000000