下午好,

从来没有用过 C# 来做严肃的数学工作,我刚刚注意到一些让我感到困惑的事情......如果这是真的

double Test = Math.Sqrt(UInt64.MaxValue)

等于 4294967296.0,也就是 UInt32.MaxValue + 1 ,为什么会这样
ulong Test2 = UInt32.MaxValue * UInt32.MaxValue;

等于1?乍一看,在我看来,这里发生了溢出……但为什么会这样,因为该产品应该适合 UInt64

非常感谢你。

最佳答案

第一个发生是因为 double 没有 64 个尾数位,但只有 53 个左右。因此 UInt64.MaxValue 将在转换为 UInt64.MaxValue+1 期间四舍五入为 double 。而它的 Sqrt 显然是 2^32。 double 可以准确地表示来自 (U)Int32 的任何值,但一些较大的 64 位整数不能表示为 double

第二个发生是因为您在转换为 UInt64 之前进行乘法运算,即它发生为 UInt32 ,这显然会溢出。将至少一个操作数转换为 UInt64,问题就会消失。

关于C#算术题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5247814/

10-11 16:04