双重呈现和精确度?

Double presentation and 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);

你的函数溢出了...使用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);

您正在使用 double5 添加到 2128。要使 5 的添加产生任何效果,至少需要使用 127 位来表示有效位。如果我没记错的话,它使用 52。您需要使用更大的表示。由于您只进行整数运算,因此应该使用大整数表示。