matlab里,怎样对小数取有效位?我想把m=0.34取为m=0.3,该怎样?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab里,怎样对小数取有效位?我想把m=0.34取为m=0.3,该怎样?相关的知识,希望对你有一定的参考价值。
matlab里面好像只能对总的有效位数进行控制,只对小数的话目前没有太好的办法。有些方法是可以用的,就是太复杂了,比如说方法1:digits+vpa 方法
该方法是用digits()设定运算精度,然后用vpa获得所要的小数位数。该方法可以达到获取需要的任意位小数,但弊端很多,其1,运算精度里包含了整数部分,所以需要提取整数部分和分数部分,并计算整数部分的位数,以下程序中求len就是整数位数。其2,获得的结果是符号型,符号型的运算速度要比数值慢上很多。
format long
a = input('please give a number which will be changed£º');
n = input('how many decimal digits will you keep: ');
num = floor(a);
str = num2str(num);
len = length(str);
err = a-num; % 获取小数部分
digits(n+len); % 此处为需要的小数位 + 整数位数
need_num = num+vpa(err,n+len); %%%% 获得按要求保留的小数,但获得的是符号性
need_str = num2str(double(need_num)) %%%%% 符号型转浮点型,再转字符型
运行结果:
please give a number which will be changed:3.1415926
how many decimal digits will you keep: 2
need_str =
3.14
方法2:round 函数法
该方法为先将要保留的部分转成整数,即切除不要的尾部,然后再恢复成所要的相应小数。该方法最为简洁,但不可恢复。
format long
a = input('please give a number which will be changed:');
n = input('how many decimal digits will you keep: ');
b = a*10^n;
aa = round(b);
need_num = aa/10^n; %%%%% 先化成整数,再转成小数
need_str = num2str(need_num)
运行结果:
please give a number which will be changed:pi
how many decimal digits will you keep: 2
need_str =
3.14
方法3:直接转成字符串,再取需要位数
该方法是直接转成需要的字符串,再截取所要的小数位。缺点是连四舍五入都没有,直接截断尾部。
format long
a = input('please give a number which will be changed:');
n = input('how many decimal digits will you keep: ');
num = floor(a);
str = num2str(num);
len = length(str);
str1 = num2str(a);
need_str = str1(1:(len+n+1)) %%%取需要的长度,这里需要加上整数长和小数点1位
运行结果:
please give a number which will be changed:pi
how many decimal digits will you keep: 2
need_str =
3.14
方法4:fprintf方法
该方法仅仅只是输出显示,并无法达到转成字符的效果。而且无法动态控制。
a = input('please give a number which will be changed:');
n = input('how many decimal digits will you keep: ');
fprintf('a = %3.2f\n',a) %%%%3.2f中.2就是小数位数
运行结果:
please give a number which will be changed:pi
how many decimal digits will you keep: 2
a = 3.14 参考技术A 无
C语言有效位
float的有效位为7位,这7位怎么算,包括小数点吗?是从小数点后面开始数7位,还是怎样?例如222223.523642566 输出是什么?
对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数),1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示;
2、第30~23 bit为幂数,其读数值用e表示(就是lz所说的有效位)
3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x;
则按照IEEE 754的规定,该浮点数的值用十进制表示为:
= (-1)^s * (1 + x) * 2^(e - 127)
对于49E48E68来说,
1、其第31 bit为0,即s = 0
2、第30~23 bit依次为100 1001 1,读成十进制就是147,即e = 147。
3、第22~0 bit依次为110 0100 1000 1110 0110 1000,也就是二进制的纯小数0.110 0100 1000 1110 0110 1000,其十进制形式为0.78559589385986328125,即x = 0.78559589385986328125。
这样,该浮点数的十进制表示
= (-1)^s * (1 + x) * 2^(e - 127)
= (-1)^0 * (1+ 0.78559589385986328125) * 2^(147-127)
= 1872333
对于把具体的浮点值写成机器表示的IEEE浮点数的形式,过程与上面相反。另外还有NaN(Not a Number),Inf(无穷),指数为0时的非规格化数等概念,需要查看IEEE 754 标准或《深入理解计算机》这本经典著作。
参考资料:http://www.pediy.com/bbshtml/bbs3/Forum669.htm
参考技术A 注意一下,float型,有效位数是7位,但是保留6位有效小数所以222223.523642566 输出222223.523643(最后一位四舍五入)本回答被提问者采纳 参考技术B 你理解错了,是二进制概念上的有效位,不是十进制。
你看看IEEE 754的标准就很清楚了。
以上是关于matlab里,怎样对小数取有效位?我想把m=0.34取为m=0.3,该怎样?的主要内容,如果未能解决你的问题,请参考以下文章