双重表现和精确度?

时间:2015-01-10 19:10:23

标签: c# c++ double precision

我在c ++中编写了以下代码:

double t = pow(pow(2, 32), 4)+5;
double div = floor(t / pow(2, 32));
double div2 = div*pow(2, 32);
double remain = t - div2;
cout << remain << endl;

剩下的必须是5但控制台和调试显示我0.00000000 ???为什么呢?

c#中的类似代码:

double t = Math.Pow(Math.Pow(2, 32), 4) + 5;
double div = Math.Floor(t / Math.Pow(2, 32));
double div2 = div * Math.Pow(2, 32);
double remain = t - div2;
Console.WriteLine(remain);

2 个答案:

答案 0 :(得分:3)

您正在使用double 5 添加到 2 128 。为了增加 5 以产生任何效果,它需要使用至少127位来表示重要性。如果我没记错的话它会使用52。你需要使用更大的代表。由于您只进行整数运算,因此应该使用大整数表示。

答案 1 :(得分:1)

您的功能溢出...使用BigInteger ...

var t = BigInteger.Pow(BigInteger.Pow(2, 32), 4) + 5;
var div = t / BigInteger.Pow(2, 32);
var div2 = div * BigInteger.Pow(2, 32);
var remain = t - div2;
Console.WriteLine(remain);