作业帮 > 数学 > 作业

在perl里,$value = 9.01e+21 + 0.01 - 9.01e+21; print ("first va

来源:学生作业帮 编辑:拍题作业网作业帮 分类:数学作业 时间:2024/05/15 18:46:59
在perl里,$value = 9.01e+21 + 0.01 - 9.01e+21; print ("first value is ",$value,"\n");
其输出结果为first value is 0 为什么是0而不是0.01呢,书上说道“浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意.指数的范围通常为-309到+308.“,寄存器我知道是什么东东.其输出结果为first value is 0 为什么是0而不是0.01呢
寄存器是CPU里面的一个存储装置(有很多个,每个的意义都是不一样的,有的用来放地址,有的用来放数据,存取速度非常快,用来做运算操作数的临时存放地.让cpu中的运算器随时能取到)
应该是$value = 9.01e+21 + 0.01 - 9.01e-21吧
浮点寄存器通常不能精确地存贮浮点数是因为 浮点的存储方式造成的
举个例子 为了表示-309 到 +308 次方的范围空间, 字节一部分是用来存小数,另外一部分用来存指数,指数的大小表明小数点的位置,所以称为浮点. 而存小数的那部分是有限的,比如0.1234234234,就会被截断,表示为123*10 -3次方,前面存123,后面存-3
关键一句话,就是为了节省空间,而放弃了精度.
再问: 我确定是: $value = 9.01e+21 + 0.01 - 9.01e+21; print ("first value is ", $value, "\n"); 输出结果是: first value is 0 虽然你的讲解不错,但说明你和我一样不明白为说明是0而不是0.01 感谢。
再答: 9.01e+21 = 901000000000000.. 后面21-2个零。 浮点的精度问题不是一句两句能说明白的。 你要研究的话可以去看看这篇文章 http://apps.hi.baidu.com/share/detail/30212277 非常详细。 简单的来说就像容器,盛不下了,溢出了。 想象32位的浮点数是一个杯子,9.01e+21放进去就已经满了,这个时候再将0.01倒进去就溢出来了。杯子里还是9.01e+21 减去 最后得0 如果$value = 9.01e+21 - 9.01e+21+ 0.01 先倒空杯子,再放0.01 这就没有问题了。