关于二进制小数取位数的问题
一个十进制数,它在计算机内是二进制的
比如10.65625=1010.10101
那如果我现在定义一个n,如果一个浮点数的二进制小数位数大于n,
我只取它二进制小数部分的前n位。
应该用什么算法
问题点数:0、回复次数:3Top
1 楼Fragile()回复于 2004-05-02 15:03:54 得分 0
往上顶一下,希望有人能回答一下。Top
2 楼rorot(rorot)回复于 2004-05-02 17:31:05 得分 0
#include <iostream>
#include <math.h>
#include <string>
using namespace std;
class Double
{
public:
// 构造函数
Double(): n_(0), value_(0.00) {}
Double( int nCount, double value ): n_(nCount), value_( SetValue(value) ) { }
double GetValue() { return value_; }
// 转化成小数点后n位得十进制高精度数
double Format( int nCount, double value );
// 转化成小数点后nCount位得二进制字符串
const char* Format_to_bin( int nCount, double value );
protected:
const char* Decimal_to_bin( const double value );
double SetValue( double value );
int n_;
double value_;
char buffer[1024];
};
// 设置精度
double Double::SetValue( double value )
{
int N = pow( 10, n_ );
value_ = (double(int(value * N))) / N;
return value_;
}
// 格式化
double Double::Format( int nCount, double value )
{
n_ = nCount;
SetValue( value );
return value_;
}
const char* Double::Format_to_bin( int nCount, double value )
{
n_ = nCount;
value_ = value;
return Decimal_to_bin( value_ );
}
// 浮点数转化为二进制字符串
const char* Double::Decimal_to_bin( const double value )
{
double value_;
char *ptr = NULL;
// 换算浮点数得整数部分
_itoa( int(value), buffer, 2 );
int decLen = strlen( buffer );
// 添加小数点
buffer[decLen] = '.';
ptr = buffer + decLen + 1;
// 转化小数部分
value_ = value - int(value);
if ( value_ == 0.00 )
{
*ptr = '\0';
return buffer;
}
// 控制小数点后得位数
int nCount = n_;
// value_ *= 2 取整数部分作为二进制
while ( (value_ *= 2) != 2.0 && nCount > 0 )
{
*ptr++ = ( value_ >= 1.0 ? '1' : '0' );
value_ = ( value_ > 1 ? --value_ : value_ );
nCount--;
}
*ptr = '\0';
return buffer;
}
int main()
// 测试高精度转化类
{
Double obj( 2, 44.232452 );
cout << obj.GetValue() << endl;
// 转化成小数点后3位数字得高精度数
cout << obj.Format( 3, 0.23425 ) << endl;
// 转化成小数点后2位数字得二进制字符串
cout << obj.Format_to_bin( 2, 10.65625 ) << endl;
// 同上
cout << obj.Format( 2, 10.65625 ) << endl;
cout << obj.Format_to_bin( 3, 10.65625 ) << endl;
return 0;
}Top
3 楼rorot(rorot)回复于 2004-05-02 17:36:48 得分 0
我说下高精度数转化为二进制字符串得思路。
把double value_分成整数部分和小数部分分别转化
1 整数部分得转化依靠库函数_itoa( int(value), buffer, 2 );把结果放进字符串缓冲区
2 添加小数点
3 小数部分得转化自己写:给小数部分不断乘2,每次取结果得整数部分;如果结果==1.0则结束
------------------------------------
Top




