Perl 5.18.2处理sub-normal浮点数(含-0)异常问题求证
Perl 5.18.2(x86_64 Linux)下的亚正规浮点数处理异常
在x86_64 Linux环境的Perl 5.18.2中,发现亚正规数(sub-normal numbers)处理存在异常,包括-0这类特殊值。根据IEEE 64位二进制浮点数标准,2**(-1023 - 52)(即2**-1076)属于区别于0的亚正规数,但实际处理不符合预期。
核心测试会话
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
测试结果中的异常点:
- 正数亚正规数
2**-1076被直接识别为0,与0的比较返回假 - 负数亚正规数
-2**-1076同样被识别为0,但格式化输出时会显示-0,与0的比较仍返回假
边界值补充测试
数值2**-1075仍显示为0,但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
补充测试的异常点:
-2**-1074能正确识别为负数(比较返回真)-2**-1075被识别为0,比较返回假,但格式化输出仍显示-0
现寻求确认:该问题是否为Perl 5.18.2的真实缺陷,或是本人测试/理解过程中出现失误。
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

