如何处理大于double最大值的浮点数值

6

我有大于1.97626258336499E-323的值。

我不能使用BigInteger,因为它只能处理整数值。

非常感谢任何帮助。

这是失败的代码,也无法使用一些用户提供的解决方案:

BigValue / (Math.Pow((1 + ret), j));

其中BigValue是类似于15000.25的值。

返回值为-0.99197104212554987。

j的值将会在大约500-600之间。

我不知道如何使用有理数类来解决这个问题。


根据文档,最大值为1.7976931348623157E+308。http://msdn.microsoft.com/en-us/library/system.double.maxvalue.aspx - Richard Schneider
1
C#只有在.NET框架4中内置了BigInteger。对于您的任务,十进制数是否具有足够的精度?它是一个128位数字,可以容纳范围内的值±1.0×10−28至±7.9×1028。 - Niranjan Singh
@leppie,你能否建议一些本地库? - Moons
@Moons:浏览一下这个SO线程可能会对你有所帮助:https://dev59.com/eHE85IYBdhLWcg3wQxPG。 - Niranjan Singh
1
@Moons 不是很难。只需要有两个大整数,一个是非常大的(整数)数字,另一个是某个基数的幂。你只需要根据需要支持的操作(例如加法、乘法等)来确定如何对这些数字对执行操作。 - Servy
显示剩余8条评论
5个回答

1

BigRational来自微软基础类库团队。它使用大整数将其存储为分数,但支持各种运算符。

当涉及将其打印为十进制数时,我认为您需要编写自己的实现。我有一个为这个类编写的实现,但我需要找到它。


1

0

一个解决方案可能是改为在对数空间中解决问题。

你的例子将变成:

exp(log(Number) - log(1-0.9999999) * 400)

0

你需要切换到支持BigFloat类型的语言(例如Haskel和Python有本地包),或者找到一个带有C#绑定的第三方大浮点数库。曾经有一些关于GNU MP的绑定的讨论,但是逐渐消失了。也许你可以写一个!

另请参见这个讨论,其中讨论了MS BigRational。但是这与BigFloat不同。


0

学习如何使用日志来处理像这样的数字。是的,你可以使用一个大型浮点数包,但那几乎总是过度杀伤力的。通常情况下,您可以使用日志获得所需的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接