我是疯了还是Math.Pow坏了?
我使用了 的基本转换器这里并将其更改为使用 ulong 值,但是当转换大数字时,特别是高于 16677181699666568 的数字时,它返回不正确的值。我开始研究这个问题,发现 Math.Pow(3, 34) 返回值 16677181699666568,而实际上 3^34 是 16677181699666569。因此,这对我来说是一个麻烦。我认为这只是 Pow 方法中双精度的问题?我最简单的修复方法是创建我自己的采用 ulong 值的 Pow 吗?
如果是这样,最快的 Pow 方法是什么?我认为有比每次都进行乘法的 for 循环更快的东西。
I used the base converter from here and changed it to work with ulong values, but when converting large numbers, specifically numbers higher than 16677181699666568 it was returning incorrect values. I started looking into this and discovered that Math.Pow(3, 34) returns the value 16677181699666568, when actually 3^34 is 16677181699666569. This therefore throws a spanner in the works for me. I assume this is just an issue with double precision within the Pow method? Is my easiest fix just to create my own Pow that takes ulong values?
If so, what's the quickest way to do Pow? I assume there's something faster than a for loop with multiplication each time.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用 BigInteger.Pow。或者使用我的幂方法
很长时间
。You can use BigInteger.Pow. Or use my power method for
long
.问题是 Math.Pow 返回一个 double ,而最接近 16677181699666569 的 double 值是 16677181699666568。
所以没有得到 Math.Pow 。涉及 Pow:
打印 16677181699666568。
换句话说,无论
Math.Pow
在内部做什么,它都无法返回比您的结果更准确的结果重新得到。正如其他人所说,
BigInteger.Pow
是您的朋友。
The problem is that
Math.Pow
returns adouble
, and the closestdouble
value to 16677181699666569 is 16677181699666568.So without getting
Math.Pow
involved:That prints 16677181699666568.
In other words whatever
Math.Pow
does internally, it can't return a result that's more accurate than the one you're getting.As others have said,
BigInteger.Pow
is your friend if you're using .NET 4.阅读每个计算机科学家应该了解的浮点知识< /a>
浮点类型是近似值,您看到的舍入是正常的。
如果您想要精确的结果,请使用
BigInteger
< /a>.Read What Every Computer Scientist Should Know About Floating-Point
Floating point types are an approximation, the rounding you see is normal.
If you want exact results use
BigInteger
.是的。
您可以使用 BigInteger.Pow。
Yes.
You can use BigInteger.Pow.
如果您使用 .NET Framework 4,Microsoft 已包含一个新的 BigInteger 类,可让您操作大数。
http://msdn.microsoft.com/en-us/library /system.numerics.biginteger.aspx
或者,您可以使用其他人创建的一个不错的库:
http:// /intx.codeplex.com/(IntX 库)
If you're using .NET Framework 4, Microsoft has included a new BigInteger class that lets you manipulate large numbers.
http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx
Alternatively, you can use a nice library that someone else created:
http://intx.codeplex.com/ (IntX library)