㈠ 关于定点DSP实现浮点运算的问题(如果没有Q格式要怎么实现呢)求高手
谁有这方面的资料,针对ccs编译器处理的。
㈡ 请教高手: compaq visual fortran 6.6 的编译器中使用双精度浮点数出现问题
把
EK = -1.1
改为:
EK = -1.1D0
或者
EK = -1.1_8
既可!
请注意,-1.1 是个常数,常数也有类型。如果单纯的 -1.1,他还是单精度的常数。
而 -1.1D0 或 -1.1_8 才是双精度的常数
㈢ C语言的问题
我用vc6.0编译你的程序输入3000没有问题。你这程序有问题。
在有小数参与运算时,用float型变量,因为给整型变量赋值浮点数,会把小数直接舍掉。输入3127这样的数,肯定结果会丢掉小数那部分。
至于你说输入3000也有问题,我想可能是tc编译器对浮点数参与整型变量运算的处理与VC不同。
㈣ 如何在C++语言中对浮点数进行格式化处理
如有一个函数,其可接受一个long double参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值123.45678应该生成"123.45"这样的字符串。表面上看来这是一个意义不大的编程问题,然而,如果真要在实际中派上用场,函数应设计为具有一定弹性,以允许调用者指定小数位数。另外,函数也应该能够处理各种异常情况,如像123.0或123这样的整数。
在开始之前,先看一下编写"优雅"C++代码时的两句"真言":
"真言"1:无论何时需要格式化一个数值,都应先转换为一个字符串。这样可保证每位数刚好占据一个字符。
字串4
"真言"2:在需要转换为字符串时,请使用<sstream>库。
转换函数的接口非常简洁:第一个参数是需被格式化的数值;第二个参数代表小数点后显示的小数位,且应该具有一个默认值;返回值为一个string类型:
string do_fraction(long double value, int decplaces=3);
注意,第二个参数代表的小数位数中包括了小数点,因此,两位小数需要默认值为3.
精度问题
当然,第一步是把long double值转换为一个string,使用标准C++库<sstream>简直是手到擒来。然而,有一件事情必须引起注意,因为某些原因, stringstream对象默认精度为6,而许多程序员错误地把"精度"理解为小数的位数,这是不正确的,精度应指代全部位数。因而,数字 1234.56可安全地 通过默认精度6来表示,但12345.67会被截断为12345.6.这样的话,如果你有一个非常大的数,如1234567.8,它的结果会静悄悄地转换 为科学记数法:1.23457e+06,这显然不是我们想要的。为避免这样的麻烦,在开始转换之前,应把默认精度设为最大。
字串8为得到long double能表示的最大位数,可使用<limits>库: string do_fraction(long double value, int decplaces=3)
{
int prec=numeric_limits<long double>::digits10; // 18
ostringstream out;
out.precision(prec);//覆盖默认精度
out<<value;
string str= out.str(); //从流中取出字符串 数值现在存储在str中,等待格式化。
小数点的位置
要进行格式化,首先要确定小数点的位置,如果小数位多于decplaces,do_fraction()会删除多余的。
要定位小数位,可使用string::find(),在STL算法中使用了一个常量来代表"数值未找到",在字符串中,这个常量为string::npos: 字串4
char DECIMAL_POINT='.'; // 欧洲用法为','
size_t n=str.find(DECIMAL_POINT);
if ((n!=string::npos)//是否有小数点呢?
{
//检查小数的位数
}
如果没有小数点,函数直接返回字符串,否则,函数将继续检查小数位是否多于decplaces.如果是,小数部分将会被截断: size_t n=str.find(DECIMAL_POINT);
if ((n!=string::npos)//有小数点吗?
&&(str.size()> n+decplaces)) //后面至少还有decplaces位吗?
//在小数decplaces位之后写入nul
str[n+decplaces]='