首页 > 试题广场 >

以下数字在表示为double(8字节的双精度浮点数)时存在舍

[不定项选择题]
以下数字在表示为double(8字节的双精度浮点数)时存在舍入误差的有()。
  • 2的平方根
  • 10的30次方
  • 0.1
  • 0.5
  • 100
推荐
这道题的答案应该是ABC
A毫无疑问不用说

8字节的共64位,按照标准的浮点数表示方法,应该是1位符号位,11位指数位,52位尾数位
对于 B(2^90 < B < 2^100)来说,指数位是够了,但是尾数位会不会够呢?  B = 2^30*5^30 也就是说将B表示成二进制后,其后30位全为0,从其第一个不为0到最后一个不为0的二进制表示位中,至少需要90-30 = 60位来存储,而其尾数位只有52位,必然会产生舍入误差,所以B是的

对于C来说,将C表示成二进制便知 10[0.1] = 2[0.00011001100110011.......],亦为无限循环小数,所以将0.1表示成二进制的double型必然也会产生舍入误差



 
编辑于 2015-08-31 10:23:58 回复(19)
A. 2的平方根,本身就是无限小数,因此肯定有舍入误差
B. 10的30次方,明显超出了double的数据存储范围,故有舍入误差
C. 0.1不能用2的负整数次方来表示,因此有误差
D. 0.5 = 2^(-1),因此没有误差
E. 100的二进制表示是:0110 0100,因此没有误差
发表于 2017-09-23 10:30:34 回复(0)
答案A很明显肯定存在误差;答案B中的数10^30 约等于2的9>2^64 ,肯定超出了double型能表示的最大数,因此肯定存在误差;答案c,小数点后的第一位位权应该为2的-1次,即0.5,第二位也就是2的-2次,即0.25。。。因此答案C存在误差,而答案D没有误差。
发表于 2015-09-04 11:23:29 回复(1)
对于B,8 字节为 64 位。由于 1030 = 230 * 530 > 230 * 430 = 290 > 264 ,所以存在舍入误差。
发表于 2017-07-23 13:58:12 回复(0)
你说0.1有舍入误差我信,1e30也有舍入误差我就不能接受了,那我的图怎么说?

发表于 2016-08-05 20:42:31 回复(1)
答案A很明显肯定存在误差;答案B中的数10^30 约等于2的9>2^64 ,肯定超出了double型能表示的最大数,因此肯定存在误差;答案c,小数点后的第一位位权应该为2的-1次,即0.5,第二位也就是2的-2次,即0.25。。。因此答案C存在误差,而答案D没有误差。
发表于 2018-05-08 17:13:55 回复(0)
大家都是大神,秒杀呀!连解释都看不懂,谁可以通俗的解释下?
发表于 2017-07-10 08:08:52 回复(0)
8字节的共64位,按照标准的浮点数表示方法,应该是1位符号位,11位指数位,52位尾数位 对于 B(2^90 < B < 2^100)来说,指数位是够了,但是尾数位会不会够呢?  B = 2^30*5^30 也就是说将B表示成二进制后,其后30位全为0,从其第一个不为0到最后一个不为0的二进制表示位中,至少需要90-30 = 60位来存储,而其尾数位只有52位,必然会产生舍入误差,所以B是的 对于C来说,将C表示成二进制便知 10[0.1] = 2[0.00011001100110011.......],亦为无限循环小数,所以将0.1表示成二进制的double型必然也会产生舍入误差
发表于 2017-01-18 21:07:23 回复(2)
表示为double。。没说要表示为二进制啊?不懂
发表于 2016-09-05 13:21:46 回复(0)
arron回答三风格(解释/代码/结果),

奉上解释
  2平方根 无线循环小数也,当然要截取。答案:a

奉上可运行代码(含测试用例)
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 int main()
 {
 double x1=sqrt(2.0);//sqrt(2) fail
 double x2=pow(10.0,30);//use pow(10,30)fail
 double x3=0.1;
 double x4=0.5;
 double x5=100;
 printf("%lf %lf %lf %lf %lf",x1,x2,x3,x4,x5);
 system("pause");

 return 0;
 }


奉上结果:


编辑于 2015-08-31 10:23:29 回复(2)
小数点后的位权应该是2的负数次方才没有误差,其它的情况都有误差。
发表于 2016-05-22 15:40:43 回复(7)
这题感觉是在牛客刷到最难的选择题了。。。
发表于 2019-08-19 17:04:02 回复(0)
对于C选项,小数的二进制表示方法如下:  可知0.1[10] = 0.0 0011 0011 0011...  ,其中0011无限循环

编辑于 2019-06-05 11:58:01 回复(0)
小数点后的位权应该是2的负数次方才没有误差,其它的情况都有误差。
计算机用二进制形式表示数据
发表于 2017-09-05 21:34:52 回复(0)
需要转换成二进制后再看是否超出
发表于 2017-08-28 16:01:56 回复(0)
发表于 2017-05-23 11:55:24 回复(0)
舍入误差的意思就是有所取舍吗?

发表于 2015-07-16 14:23:58 回复(0)
A
2的平方根属于无线小数
发表于 2015-01-26 21:37:38 回复(0)
等待高手回答
发表于 2015-01-09 17:37:03 回复(0)