我是疯了还是Math.Pow坏了?

发布于 2024-10-26 05:27:47 字数 408 浏览 2 评论 0原文

我使用了 的基本转换器这里并将其更改为使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

つ低調成傷 2024-11-02 05:27:47

您可以使用 BigInteger.Pow。或者使用我的幂方法很长时间

You can use BigInteger.Pow. Or use my power method for long.

拥醉 2024-11-02 05:27:47

问题是 Math.Pow 返回一个 double ,而最接近 16677181699666569 的 double 值是 16677181699666568。

所以没有得到 Math.Pow 。涉及 Pow:

long accurate = 16677181699666569;
double closestDouble = accurate;
// See http://pobox.com/~skeet/csharp/DoubleConverter.cs
Console.WriteLine(DoubleConverter.ToExactString(closestDouble));

打印 16677181699666568。

换句话说,无论 Math.Pow 在内部做什么,它都无法返回比您的结果更准确的结果重新得到。

正如其他人所说, BigInteger.Pow是您的朋友。

The problem is that Math.Pow returns a double, and the closest double value to 16677181699666569 is 16677181699666568.

So without getting Math.Pow involved:

long accurate = 16677181699666569;
double closestDouble = accurate;
// See http://pobox.com/~skeet/csharp/DoubleConverter.cs
Console.WriteLine(DoubleConverter.ToExactString(closestDouble));

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.

满身野味 2024-11-02 05:27:47

阅读每个计算机科学家应该了解的浮点知识< /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.

岁月苍老的讽刺 2024-11-02 05:27:47

我认为这只是一个问题
Pow 内的双精度
方法?

是的。

我最简单的修复就是创建我的
自己的 Pow 需要 ulong 值?

您可以使用 BigInteger.Pow。

I assume this is just an issue with
double precision within the Pow
method?

Yes.

Is my easiest fix just to create my
own Pow that takes ulong values?

You can use BigInteger.Pow.

柳絮泡泡 2024-11-02 05:27:47

如果您使用 .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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文