Math.Pow 计算不正确

发布于 2024-10-05 00:46:49 字数 442 浏览 4 评论 0原文

我在使用 C# 时遇到问题。准确地说,是 Math.pow()。如果我尝试计算 15^14,则会得到“29192926025390624”。但如果我用 Wolfram Alpha 计算它,我会得到“29192926025390625”。正如您所看到的,唯一的区别是 1 个数字。不过 Wolfram Alpha 是正确的。为什么不是 C# ?我该如何解决这个问题,以便在 C# 中获得正确的值?7

我的代码相当简单,因为我只是尝试使用硬编码示例。所以我正在做的是: Math.Pow(15,14); 这给出了 29192926025390624。而不是正确答案“29192926025390625”。

链接:Wolfram Alpha

I'm having a problem with C#. To be precise with the Math.pow(). If I try to calculate 15^14 then I get "29192926025390624". But if I calculate it with Wolfram Alpha I get "29192926025390625". As you can see this only difference is 1 number. Wolfram Alpha is correct though. Why isn't C# ? and how do I fix this so I can get the correct value in C# ?7

My code is fairly simple since I'm just trying with hardcoded examples. So what I'm doing is : Math.Pow(15,14); This gives 29192926025390624. And not "29192926025390625" which is the correct answer.

Links : Wolfram Alpha

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(5

调妓 2024-10-12 00:46:50

Math.Pow() 工作正常,但存在双数据类型的问题
看到这个。

        double i = 29192926025390625;
        Console.WriteLine("{0}",i);//the result will be 29192926025390624.0

哎呀抱歉,通过断点检查值;在你的程序中;

Math.Pow() is working correctly its problem with double data type
see this.

        double i = 29192926025390625;
        Console.WriteLine("{0}",i);//the result will be 29192926025390624.0

Oops Sorry, Check value by breakpoint; in your program;

梦中的蝴蝶 2024-10-12 00:46:50

C# 的 Math.pow 返回 Double,即 IEEE 754 标准浮点数。它只有 15 位有效数字:

http://msdn.microsoft .com/en-us/library/system.math.pow.aspx

C#'s Math.pow returns a Double, an IEEE 754 standard floating point number. It only has 15 significant digits:

http://msdn.microsoft.com/en-us/library/system.math.pow.aspx

爱情眠于流年 2024-10-12 00:46:49

Math.Pow 对浮点类型进行操作,根据定义,浮点类型是不准确的。如果需要任意精度整数,请使用任意精度整数类型,例如 BigInteger 结构。 BigInteger 还有一个 Pow 方法。

Math.Pow operates on floating-point types, which are by definition inaccurate. If you need arbitrary precision integers, use an arbitrary precision integer type such as the BigInteger structure. BigInteger also has a Pow method.

放赐 2024-10-12 00:46:49

Math.Pow 适用于双打。这个长时间的实现得到了正确的答案:

Func<long, int, long> power = null;
power = (i, p) => p == 1 ? i : i*power(i, p - 1);
Console.WriteLine(power(15, 14));

Math.Pow works on doubles. This implementation with long gets the correct answer:

Func<long, int, long> power = null;
power = (i, p) => p == 1 ? i : i*power(i, p - 1);
Console.WriteLine(power(15, 14));
初见你 2024-10-12 00:46:49

Math.Pow 适用于双打。 双精度数是 64 位浮点数,在 C# 中具有大约 15-16 位精度,因此,您看到的是舍入误差。这就是浮点数的工作原理。

如果您需要更高的精度,请尝试使用十进制。它是128位,以10为基数。这可以准确表示最多 28-29 位有效数字。您可以轻松定义自己的十进制 Pow 方法。

如果 decimal 不够,请转向 BigInteger,在.NET 4中添加。

Math.Pow works on doubles. Doubles are 64 bit floating point and have about 15-16 digits of precision in C#, and therefore, what you are seeing is a rounding error. That is how floating point numbers work.

If you need more precision, try to use decimal. It is 128 bits and uses 10 as the base. This gives you accurate representation of numbers up to 28-29 significant digits. You can easily define your own Pow method for decimal.

If decimal is not enough, turn to BigInteger, which was added in .NET 4.

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