我尝试过BigInteger,十进制,漂浮和长但没有运气。 Screenshot of required output example
答案 0 :(得分:4)
编写自己的理性课程是一项相当容易的任务;记住,有理数只是整数对,你已经有了BigInteger。
在本系列文章中,我展示了如何设计自己的大整数和大理性类,从绝对没有,甚至不是整数。请注意,这并不快,而且不是很快;它旨在教育。您可以使用我在本系列中描述的技术来帮助您设计算术类。
https://ericlippert.com/2013/09/16/math-from-scratch-part-one/
或者,如果您不想自己编写,可以随时使用Microsoft提供的那个:
http://bcl.codeplex.com/wikipage?title=BigRational&referringTitle=Home
但那说......
我需要至少128个小数位来计算不同时间步之间事件的精确概率
您是否需要128个小数位来表示精度或幅度的128位数?因为如果它只是幅度,那么只需将概率数学转换为对数并进行双数学计算。
答案 1 :(得分:1)
实现任意精度数字的最简单方法是将BigInteger
System.Numerics
类与int
指数结合起来。你可以使用BigInteger
作为你的指数,但这可能是过度的,因为这些数字在规模上可能是有意义的。
所以如果你沿着这些方向创建一个类:
public class ArbDecimal
{
BigInteger value;
int exponent;
public override string ToString()
{
StringBuilder sb = new StringBuilder();
int place;
foreach (char digit in value.ToString())
{
if (place++ == value.ToString().Length - exponent)
{
sb.Append('.');
}
sb.Append(digit);
}
return sb.ToString();
}
}
然后,您应该能够使用value
和exponent
字段的索引定律来定义数学运算。
例如,要实现加法,您可以将较大的值缩放为与较小的值相同的指数乘以10^(largerExp-smallerExp)
,然后将两个值相加并重新缩放。
在您的班级中,数字0.01
将表示为:
value = 1
exponent = -2
由于1*10^-2 = 0.01
。
利用这种方法,您可以存储任意精确(和大)数字,仅限于可用的ram和.NET
框架的对象大小限制。