标题:[讨论]c++ double 精度丢失的问题
取消只看楼主
ysol
Rank: 1
等 级:新手上路
帖 子:107
专家分:0
注 册:2006-6-11
 问题点数:0 回复次数:2 
[讨论]c++ double 精度丢失的问题

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cmath>

typedef unsigned int uint;

long double BinStringToD (string s);//将2进制字符串转化为10进制。

void main(void)
{
string s1="1111111111111111111111111111111111111111111111111111111111111111";
//要进行转换的64位2进制串
cout<<s1.length()<<endl;
cout.precision(20);
cout<<BinStringToD(s1)<<endl;

}


long double BinStringToD (string s)
{
string sU="0", sL="0";
uint tem1=0,tem2=0;
char chr='0';
//截取串,低32位赋给sL,高32位赋给sU.
if(s.length()>32)
{
sU=s.substr(0,(s.length()-32));
sL=s.substr(s.length()-32,32);
}

else
{
sL=s;
sU="";
}
//分别将sL,sU转化成双无符号整形tem1,tem2;
for(istringstream sinL (sL);sinL.get(chr);)
{
tem1<<=1;
tem1+=(chr-48);
}
for(istringstream sinU (sU);sU.length() && sinU.get(chr);)
{
tem2<<=1;
tem2+=(chr-48);
}

//精度丢失!!!!!!!!
long double t1=static_cast<long double>(tem1);
long double t2=static_cast<long double>(tem2);
t1=t1*pow(2,32);
return t1+t2;

}
输出结果为18446744073709552000
正确结果为18446744073709551615

请高手指点!!!!

[此贴子已经被作者于2006-6-11 20:03:35编辑过]

搜索更多相关主题的帖子: double 精度 string include 进制 
2006-06-11 10:48
ysol
Rank: 1
等 级:新手上路
帖 子:107
专家分:0
注 册:2006-6-11
得分:0 

不转化也一样啊!!郁闷中!!!!!!

2006-06-11 20:04
ysol
Rank: 1
等 级:新手上路
帖 子:107
专家分:0
注 册:2006-6-11
得分:0 

绝对没有超出long double 的范围阿,long double 20个字节,有效位为64个2进制位!!!

2006-06-16 20:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-71353-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.109631 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved