乘以两个BigDouble值

时间:2013-10-04 13:10:24

标签: .net math biginteger

我正在尝试在.NET中创建一个“BigDouble”结构。 BigDouble数字有一个BigInteger组成部分和一个双重小数部分。

实现加法和减法很简单,但如何进行乘法/除法?问题是我找不到将BigInteger与double相乘的方法。我该怎么办?

请记住:我需要一个确切的楼层和一个近似的小数部分。

1 个答案:

答案 0 :(得分:0)

double具有固定数量的mantiassa位和指数。根据IEEE规范,mantiassa将有52位,小数点前的bis被省略,但总是为1.因此实际上你至少有53位信息超过小数点。如果你很幸运并且小数部分很小,你可能有更高的分辨率,但如果积分部分不为零,这似乎不太可能。

因此,一种解决方案是将小数部分乘以2 53 并将其四舍五入为整数。然后,您可以使用这些缩放值进行计算,使用它们形成更大的整数,然后缩小。如果您想不惜一切代价避免数据丢失,则必须确定double数字的指数并相应地进行缩放。我知道其他语言中的一些函数,例如Java中的Math.getExponent或C中的ilogb。我猜想.net中有类似的内容,但我不知道。

但是这整个观察告诉我(也可能告诉你)double可能不是存储小数部分的合适方式。 double的强度是它的浮点:您可以使用更改指数存储极小值和极大值。但是,在您的应用程序中,您将以大约相等的概率存储范围[0,1)中的值(或者我假设)。因此double的主要优势未被使用。我想你可能最好使用基于BigInteger的固定精度。我建议使用64位小数点。存储要求与您的方法相同,因为double需要64位。但在大多数情况下,准确度将增加大约11位,因为您可以将所有64位用于有用数字,而不是仅使用53位。而且性能也会好很多,因为您不必在格式之间进行转换。